Yii2系列教程三:Database And Gii

來源:互聯網
上載者:User

標籤:

上一篇文章我們理了一下Yii2的MVC,Forms和Layouts,這篇文章就直接按照約定來說說Yii2與資料庫相關的一些事情,如果你覺得不夠的話,不急,更具體的用法我會在後續的教程給出,並且這裡也會介紹Yii2的代碼產生工具:強大的Gii。

你可以直接到Github下載項目源碼:https://github.com/JellyBool/helloYii,這樣你就可以直接跟上我的進度了,每一次我寫完一個教程,我都會將代碼push到Github,所以,你想偷懶的話,這是一個不錯的方法。

接著上一篇文章,我們的初衷還是沒有改變:建立一個可以發表狀態(status)的web小應用,你可以看成是QQ空間的說說的mini版,只不過之前我們沒有將資料存在資料庫裡面而已。

建立一個資料庫

由於我平時開發基本都是使用Mysql,而且資料庫管理工具我比較喜歡Sequel Pro,所以,我就直接在Sequel Pro裡面建立一個hello的資料庫。當然,你也可以直接用命令列來建立資料庫,大概是這樣的:

CREATE DATABASE hello;

有了資料庫之後,我們就可以將我們的Yii應用與資料庫進行串連了,Yii2的資料庫設定檔位於/config/db.php中,我們可以開啟它來進行相應的配置,請注意根據自己的實際情況進行相應的修改:

<?phpreturn [    ‘class‘ => ‘yii\db\Connection‘,    ‘dsn‘ => ‘mysql:host=localhost;dbname=hello‘, ‘username‘ => ‘root‘, ‘password‘ => ‘password‘, ‘charset‘ => ‘utf8‘,];
建立Migration

這裡直接使用了migration這個單詞,其實我不知道該翻譯成什麼才比較確切;所以本文就直接使用migration這個單詞了,如果你知道有特別貼切的翻譯,請大聲對我說。其實migration的最大目的可能就是建立資料表了,但是我們為什麼還要使用migration了?這可能都是受到Rails大法的影響,因為這樣的好處其實很多,migration不僅可以讓開發人員動態建立和更新一個資料庫表的schema,還可以應對多個伺服器的時候環境不同的問題,直接就避免匯入sql檔案的各種坑。

至於在代碼中我們該怎麼命名我們的資料表,我比較喜歡的是直接跟Model一樣,如果是單複數問題也無所謂,這看個人,所以這裡,我會選擇建立一個status表,iTerm命令列執行:

cd Desktop/helloYii/./yii migrate/create create_status_table

過程當中會詢問是否建立migration,果斷yes,然後完成之後大概是這樣的:

這條命令會在項目目錄下建立一個migrations/目錄,裡面就有剛剛我們建立的migration檔案,名字大概是這樣的:m150804_035107_create_status_table.php,然後我們就可以開啟這個檔案來一睹芳容了:

<?phpuse yii\db\Schema;use yii\db\Migration;class m150804_035107_create_status_table extends Migration{ public function up() { } public function down() { echo "m150804_035107_create_status_table cannot be reverted.\n"; return false; }

嗯,大概就是這樣,up()方法是我們後面執行./yii migrate/up命令的時候觸發的,這裡一般都是負責建立一個表,我們可以將表的schema寫在這個方法裡面。

建立status表

有了上面的migration之後,我們可以直接在up()方法寫上一些我們的欄位和配置:

public function up() { $tableOptions = null; if ($this->db->driverName === ‘mysql‘) { $tableOptions = ‘CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB‘; } $this->createTable(‘{{%status}}‘, [ ‘id‘ => Schema::TYPE_PK, ‘message‘ => Schema::TYPE_TEXT.‘ NOT NULL DEFAULT ""‘, ‘permissions‘ => Schema::TYPE_SMALLINT . ‘ NOT NULL DEFAULT 0‘, ‘created_at‘ => Schema::TYPE_INTEGER . ‘ NOT NULL‘, ‘updated_at‘ => Schema::TYPE_INTEGER . ‘ NOT NULL‘, ], $tableOptions); } public function down() { $this->dropTable(‘{{%status}}‘); }

這裡我們的status會有5個欄位,id為主鍵,message和permissions就是上一篇我們的文本輸入框輸入的常值內容和下拉選擇框的內容;這裡我們還要兩個created_at和updated_at欄位,呃,你可以說我被Laravel洗腦了。

down()方法與up()相對應,用來刪除資料表的,我希望你不會用到。

更多詳細內容參考這裡:

http://www.yiiframework.com/doc-2.0/guide-db-migrations.html

有了表的schema之後,我們就可以來執行我們的migrate命令了,命令列執行:

    ./yii migrate/up

過程中還是果斷yes,然後完成之後你就可以到到hello資料庫去看status表了:

這裡你還會看到一個migration的表,這是Yii2的migrate自動產生了,它是用來管理我們自己建立的migration(這裡指資料表),你可以不用關心它。

使用Yii2的migrate建立完資料表之後,我們下一步就來上手一下Yii2的代碼產生工具Gii了,因為我們會通過Gii來產生我們的Model和Controller等檔案。

使用Gii

Gii作為Yii的一大特性,很多人喜歡Yii可能就是因為這個,據說底層代碼寫得很棒,不過我還沒有仔細看過源碼。

首先我們來使用Gii來為每一個資料表產生一個Model,這裡也就是產生Status這個模型。

怎麼進入Gii的使用面板呢?直接在瀏覽器地址欄輸入 http://localhost:8999/gii訪問就可以了。大概是長這個樣子:

點擊Model Generator的按鈕,然後在Table Name輸入框填入表名:status

點擊下方Preview 按鈕,就可以看到Yii即將幫你產生的檔案了models/Status.php,這裡需要注意的一個地方是。因為在上一篇文章中我們手動建立了一個Status模型,所以這裡請確定你將Overwrite這個選擇框的小勾勾打上:

然後點擊Generate按鈕,產生的結果是這樣的:

這時候開啟models/Status.php,你會看到Yii會根據我們的資料表產生的驗證規則和表單屬性:

<?phpnamespace app\models;use Yii;/** * This is the model class for table "status". * * @property integer $id * @property string $message * @property integer $permissions * @property integer $created_at * @property integer $updated_at */class Status extends \yii\db\ActiveRecord{ /** * @inheritdoc */ public static function tableName() { return ‘status‘; } /** * @inheritdoc */ public function rules() { return [ [[‘message‘, ‘created_at‘, ‘updated_at‘], ‘required‘], [[‘message‘], ‘string‘], [[‘permissions‘, ‘created_at‘, ‘updated_at‘], ‘integer‘] ]; } /** * @inheritdoc */ public function attributeLabels() { return [ ‘id‘ => ‘ID‘, ‘message‘ => ‘Message‘, ‘permissions‘ => ‘Permissions‘, ‘created_at‘ => ‘Created At‘, ‘updated_at‘ => ‘Updated At‘, ]; }}

Status模型產生好之後,該為它產生相應的視圖和控制器了,這時候需要使用到的是Gii 的CRUD Generator了,即:http://localhost:8999/gii/crud

在這個頁面,分別填上對應的資料:

Model Class : app\models\StatusSearch Model Class : app\models\StatusSearchController Class : app\controllers\StatusControllerView Path : 可以直接留空,預設就是 app/views/ControllerID

然後點擊Preview預覽一下,這裡還是需要把overwrite勾選上,因為我們上一節也建立了兩個同名的視圖檔案(create.php 和 view.php):

最後還是點擊產生,你會看到類似下面這個圖片的內容:

到了這裡,我們基本上可以感覺到Gii的強大了,產生代碼簡直都不算事。這時候如果我們訪問http://localhost:8999/status ,你會看到一個預設的Status的CRUD頁面,因為我們的資料庫裡面還沒有任何資料,所以這裡看到的都是空的:

如果你還記得我們在上一篇在導覽列建立的create導航,點擊create,你就會看到類似下面這個頁面一樣的內容:

到這裡,有沒有覺得Gii實在太厲害了!要是上一篇我們直接用Gii來產生這些代碼,那開發效率實在不是一般高。

與上一篇的結合

雖然Gii足夠強大為我們產生了很多代碼,但是現在有一小部分代碼並不符合我們的要求,我們不用這麼複雜。所以下面先來把代碼先過過,以便用於滿足我們自己的要求。

首先是對建立Status的表單進行改造,我們並不希望使用者需要輸入created 和updated這兩個欄位,所以注釋掉/views/Status/_form.php中的下面的代碼:

<?= $form->field($model, ‘created_at‘)->textInput() ?><?= $form->field($model, ‘updated_at‘)->textInput() ?>

然後permissions欄位輸入我們希望這是一個下拉選擇框,還是在同一個檔案中修改:

<?=    $form->field($model, ‘permissions‘)->dropDownList($model->getPermissions(), [‘prompt‘=>‘- Choose Your Permissions -‘]) ?>

我們把原來permissions的textInput換成了上面的dropDownList,這裡的dropDownList使用到getPermissions()這個方法,但是由於剛剛在產生Status這個模型的時候我們覆蓋了原諒的Status,所以我們還是需要加上getPermissions()這個方法:

const PERMISSIONS_PRIVATE = 10;const PERMISSIONS_PUBLIC = 20;// other codes ...public function getPermissions() { return array (self::PERMISSIONS_PRIVATE=>‘Private‘,self::PERMISSIONS_PUBLIC=>‘Public‘); } public function getPermissionsLabel($permissions) { if ($permissions==self::PERMISSIONS_PUBLIC) { return ‘Public‘; } else { return ‘Private‘; } }

像上一篇提到的一樣,我們將這些代碼又寫到了Status.php這裡。然後重新整理一下:http://localhost:8999/status/create

到這裡,我們的表單改造舊完成了,跟我們之前的長得差不多了。但是這還沒有完,因為我們還需要對我們的controllers/StatusController.php做一些些小改動,主要是在actionCreate的改動:

public function actionCreate() { $model = new Status(); if ($model->load(Yii::$app->request->post())) { $model->created_at = time(); $model->updated_at = time(); if ($model->save()) { return $this->redirect([‘view‘, ‘id‘ => $model->id]); } } return $this->render(‘create‘, [ ‘model‘ => $model, ]); }

在這裡,我們添加下面這兩行來保障我們在插入資料的時候,created_at和updated_at不為空白。

$model->created_at = time();$model->updated_at = time();

這裡也是根據$model->load(Yii::$app->request->post())判斷是否有post資料過來,然後如果資料成功儲存到資料庫,我們就使用return $this->redirect([‘view‘, ‘id‘ => $model->id])重新導向到view方法(controllers/StatusController.php的actionView方法)。我們填上一些資料,然後建立一個status試試,不出意外你會看到這個可愛的頁面:

終於到了這裡了,我們現在再來修改一下我們的導航,在Status這個下來菜單下,我們增加一個菜單view,修改views/layouts/main.php檔案的Nav::widget部分:

[    ‘label‘ => ‘Status‘,    ‘items‘ => [        [‘label‘ => ‘View‘, ‘url‘ => [‘/status/index‘]], [‘label‘ => ‘Create‘, ‘url‘ => [‘/status/create‘]], ],],

就直接在Status的items裡面加一行:[‘label‘ => ‘View‘, ‘url‘ => [‘/status/index‘]],然後我們的導覽列就是這樣的了:

點擊下拉式功能表的View,然後我們就會來到:http://localhost:8999/status/index,這裡我們可以看到下面的頁面了:

這個視圖檔案位於views/status/index.php,如果你想修改一下,你可以直接修改這個檔案。

啊,感覺這一篇文章的路走得好長,不過其實真正編碼的時間並不過,真正可能也就幾分鐘而已,我們實現了對資料庫的一些基本操作和領略Gii的強大。這一篇就先寫到這裡了,下一篇打算會寫一點關於使用者註冊和登入的準系統。

源碼會放在 Github:https://github.com/JellyBool/helloYii

Yii2系列教程三:Database And Gii

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.