<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                > 原文出處:https://jellybool.com/post/programming-with-yii2-working-with-the-database-and-gii 上一篇文章我們理了一下Yii2的`MVC`,`Forms`和`Layouts`,這篇文章就直接按照約定來說說Yii2與數據庫相關的一些事情,如果你覺得不夠的話,不急,更具體的用法我會在后續的教程給出,并且這里也會介紹Yii2的代碼生成工具:強大的`Gii`。 你可以直接到Github下載項目源碼:[](https://github.com/JellyBool/helloYii)[https://github.com/JellyBool/helloYii](https://github.com/JellyBool/helloYii),這樣你就可以直接跟上我的進度了,每一次我寫完一個教程,我都會將代碼push到Github,所以,你想偷懶的話,這是一個不錯的方法。 接著上一篇文章,我們的初衷還是沒有改變:創建一個可以發表狀態`(status)`的web小應用,你可以看成是QQ空間的說說的mini版,只不過之前我們沒有將數據存在數據庫里面而已。 ## 創建一個數據庫 ![替代文字](https://box.kancloud.cn/2015-08-15_55cf2cb26601e.png) 由于我平時開發基本都是使用Mysql,而且數據庫管理工具我比較喜歡Sequel Pro,所以,我就直接在[Sequel Pro](http://www.sequelpro.com/)里面創建一個`hello`的數據庫。當然,你也可以直接用命令行來創建數據庫,大概是這樣的: ~~~ CREATE DATABASE hello; ~~~ 有了數據庫之后,我們就可以將我們的Yii應用與數據庫進行連接了,Yii2的數據庫配置文件位于`/config/db.php`中,我們可以打開它來進行相應的配置,請注意根據自己的實際情況進行相應的修改: ~~~ <?php return [ '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`,然后完成之后大概是這樣的: ![替代文字](https://box.kancloud.cn/2015-08-15_55cf2cb2b92e2.png) 這條命令會在項目目錄下創建一個`migrations/`目錄,里面就有剛剛我們創建的migration文件,名字大概是這樣的:`m150804_035107_create_status_table.php`,然后我們就可以打開這個文件來一睹芳容了: ~~~ <?php use 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)[http://www.yiiframework.com/doc-2.0/guide-db-migrations.html](http://www.yiiframework.com/doc-2.0/guide-db-migrations.html) 有了表的`schema`之后,我們就可以來執行我們的migrate命令了,命令行執行: ~~~ ./yii migrate/up ~~~ 過程中還是果斷`yes`,然后完成之后你就可以到到`hello`數據庫去看`status`表了: ![替代文字](https://box.kancloud.cn/2015-08-15_55cf2cb417f75.png) 這里你還會看到一個`migration`的表,這是Yii2的migrate自動生成了,它是用來管理我們自己創建的`migration`(這里指數據表),你可以不用關心它。 使用Yii2的migrate創建完數據表之后,我們下一步就來上手一下Yii2的代碼生成工具Gii了,因為我們會通過Gii來生成我們的Model和Controller等文件。 ## 使用Gii Gii作為Yii的一大特性,很多人喜歡Yii可能就是因為這個,據說底層代碼寫得很棒,不過我還沒有仔細看過源碼。 首先我們來使用Gii來為每一個數據表生成一個Model,這里也就是生成Status這個模型。 怎么進入Gii的使用面板呢?直接在瀏覽器地址欄輸入`http://localhost:8999/gii`?訪問就可以了。大概是長這個樣子: ![替代文字](https://box.kancloud.cn/2015-08-15_55cf2cb46a3f1.png) 點擊**Model Generator**的按鈕,然后在`Table Name`輸入框填入表名:`status` ![替代文字](https://box.kancloud.cn/2015-08-15_55cf2cb4c64f8.png) 點擊下方**Preview**?按鈕,就可以看到Yii即將幫你生成的文件了`models/Status.php`,這里需要注意的一個地方是。因為在上一篇文章中我們手動創建了一個Status模型,所以這里請確定你將`Overwrite`這個選擇框的小勾勾打上: ![替代文字](https://box.kancloud.cn/2015-08-15_55cf2cb523c6f.png) 然后點擊**Generate**按鈕,生成的結果是這樣的: ![替代文字](https://box.kancloud.cn/2015-08-15_55cf2cb562985.png) 這時候打開`models/Status.php`,你會看到Yii會根據我們的數據表生成的驗證規則和表單屬性: ~~~ <?php namespace 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` ![替代文字](https://box.kancloud.cn/2015-08-15_55cf2cb5954ae.png) 在這個頁面,分別填上對應的數據: ~~~ Model Class : app\models\Status Search Model Class : app\models\StatusSearch Controller Class : app\controllers\StatusController View Path : 可以直接留空,默認就是 app/views/ControllerID ~~~ 然后點擊**Preview**預覽一下,這里還是需要把`overwrite`勾選上,因為我們上一節也創建了兩個同名的視圖文件`(create.php 和 view.php)`: ![替代文字](https://box.kancloud.cn/2015-08-15_55cf2cb609470.png) 最后還是點擊生成,你會看到類似下面這個圖片的內容: ![替代文字](https://box.kancloud.cn/2015-08-15_55cf2cb6552ae.png) 到了這里,我們基本上可以感覺到Gii的強大了,生成代碼簡直都不算事。這時候如果我們訪問`http://localhost:8999/status`?,你會看到一個默認的Status的CRUD頁面,因為我們的數據庫里面還沒有任何數據,所以這里看到的都是空的: ![替代文字](https://box.kancloud.cn/2015-08-15_55cf2cb69f9cc.png) 如果你還記得我們在上一篇在導航欄創建的`create`導航,點擊`create`,你就會看到類似下面這個頁面一樣的內容: ![替代文字](https://box.kancloud.cn/2015-08-15_55cf2cb6e6d12.png) 到這里,有沒有覺得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試試,不出意外你會看到這個可愛的頁面: ![替代文字](https://box.kancloud.cn/2015-08-15_55cf2cb745ed7.png) 終于到了這里了,我們現在再來修改一下我們的導航,在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']]`,然后我們的導航欄就是這樣的了: ![替代文字](https://box.kancloud.cn/2015-08-15_55cf2cb78d804.png) 點擊下拉菜單的View,然后我們就會來到:`http://localhost:8999/status/index`,這里我們可以看到下面的頁面了: ![替代文字](https://box.kancloud.cn/2015-08-15_55cf2cb7d419a.png) 這個視圖文件位于`views/status/index.php`,如果你想修改一下,你可以直接修改這個文件。 啊,感覺這一篇文章的路走得好長,不過其實真正編碼的時間并不過,真正可能也就幾分鐘而已,我們實現了對數據庫的一些基本操作和領略Gii的強大。這一篇就先寫到這里了,下一篇打算會寫一點關于用戶注冊和登錄的基本功能。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看