成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Yii2系列教程三:Database And Gii

wemallshop / 3402人閱讀

摘要:但是這還沒(méi)有完,因?yàn)槲覀冞€需要對(duì)我們的做一些些小改動(dòng),主要是在的改動(dòng)在這里,我們添加下面這兩行來(lái)保障我們?cè)诓迦霐?shù)據(jù)的時(shí)候,和不為空。

  

原文來(lái)自:https://jellybool.com/post/programming-with-yii2-working-with-the-data...

上一篇文章我們理了一下Yii2的MVC,FormsLayouts,這篇文章就直接按照約定來(lái)說(shuō)說(shuō)Yii2與數(shù)據(jù)庫(kù)相關(guān)的一些事情,如果你覺(jué)得不夠的話,不急,更具體的用法我會(huì)在后續(xù)的教程給出,并且這里也會(huì)介紹Yii2的代碼生成工具:強(qiáng)大的Gii。

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

接著上一篇文章,我們的初衷還是沒(méi)有改變:創(chuàng)建一個(gè)可以發(fā)表狀態(tài)(status)的web小應(yīng)用,你可以看成是QQ空間的說(shuō)說(shuō)的mini版,只不過(guò)之前我們沒(méi)有將數(shù)據(jù)存在數(shù)據(jù)庫(kù)里面而已。

創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)

由于我平時(shí)開(kāi)發(fā)基本都是使用Mysql,而且數(shù)據(jù)庫(kù)管理工具我比較喜歡Sequel Pro,所以,我就直接在Sequel Pro里面創(chuàng)建一個(gè)hello的數(shù)據(jù)庫(kù)。當(dāng)然,你也可以直接用命令行來(lái)創(chuàng)建數(shù)據(jù)庫(kù),大概是這樣的:

CREATE DATABASE hello;

有了數(shù)據(jù)庫(kù)之后,我們就可以將我們的Yii應(yīng)用與數(shù)據(jù)庫(kù)進(jìn)行連接了,Yii2的數(shù)據(jù)庫(kù)配置文件位于/config/db.php中,我們可以打開(kāi)它來(lái)進(jìn)行相應(yīng)的配置,請(qǐng)注意根據(jù)自己的實(shí)際情況進(jìn)行相應(yīng)的修改:

```
 "yiidbConnection",
    "dsn" => "mysql:host=localhost;dbname=hello",
    "username" => "root",
    "password" => "password",
    "charset" => "utf8",
];

```
創(chuàng)建Migration

這里直接使用了migration這個(gè)單詞,其實(shí)我不知道該翻譯成什么才比較確切;所以本文就直接使用migration這個(gè)單詞了,如果你知道有特別貼切的翻譯,請(qǐng)大聲對(duì)我說(shuō)。其實(shí)migration的最大目的可能就是創(chuàng)建數(shù)據(jù)表了,但是我們?yōu)槭裁催€要使用migration了?這可能都是受到Rails大法的影響,因?yàn)檫@樣的好處其實(shí)很多,migration不僅可以讓開(kāi)發(fā)人員動(dòng)態(tài)創(chuàng)建和更新一個(gè)數(shù)據(jù)庫(kù)表的schema,還可以應(yīng)對(duì)多個(gè)服務(wù)器的時(shí)候環(huán)境不同的問(wèn)題,直接就避免導(dǎo)入sql文件的各種坑。

至于在代碼中我們?cè)撛趺疵覀兊臄?shù)據(jù)表,我比較喜歡的是直接跟Model一樣,如果是單復(fù)數(shù)問(wèn)題也無(wú)所謂,這看個(gè)人,所以這里,我會(huì)選擇創(chuàng)建一個(gè)status表,iTerm命令行執(zhí)行:

```
cd Desktop/helloYii/

./yii migrate/create create_status_table

```

過(guò)程當(dāng)中會(huì)詢問(wèn)是否創(chuàng)建migration,果斷yes,然后完成之后大概是這樣的:

這條命令會(huì)在項(xiàng)目目錄下創(chuàng)建一個(gè)migrations/目錄,里面就有剛剛我們創(chuàng)建的migration文件,名字大概是這樣的:m150804_035107_create_status_table.php,然后我們就可以打開(kāi)這個(gè)文件來(lái)一睹芳容了:

```


嗯,大概就是這樣,up()方法是我們后面執(zhí)行./yii migrate/up命令的時(shí)候觸發(fā)的,這里一般都是負(fù)責(zé)創(chuàng)建一個(gè)表,我們可以將表的schema寫(xiě)在這個(gè)方法里面。

創(chuàng)建status表

有了上面的migration之后,我們可以直接在up()方法寫(xiě)上一些我們的字段和配置:

 ```
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會(huì)有5個(gè)字段,id為主鍵,messagepermissions就是上一篇我們的文本輸入框輸入的文本內(nèi)容和下拉選擇框的內(nèi)容;這里我們還要兩個(gè)created_atupdated_at字段,呃,你可以說(shuō)我被Laravel洗腦了。

down()方法與up()相對(duì)應(yīng),用來(lái)刪除數(shù)據(jù)表的,我希望你不會(huì)用到。

更多詳細(xì)內(nèi)容參考這里:

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

有了表的schema之后,我們就可以來(lái)執(zhí)行我們的migrate命令了,命令行執(zhí)行:

 ```
    ./yii migrate/up

 ```

過(guò)程中還是果斷yes,然后完成之后你就可以到到hello數(shù)據(jù)庫(kù)去看status表了:

這里你還會(huì)看到一個(gè)migration的表,這是Yii2的migrate自動(dòng)生成了,它是用來(lái)管理我們自己創(chuàng)建的migration(這里指數(shù)據(jù)表),你可以不用關(guān)心它。

使用Yii2的migrate創(chuàng)建完數(shù)據(jù)表之后,我們下一步就來(lái)上手一下Yii2的代碼生成工具Gii了,因?yàn)槲覀儠?huì)通過(guò)Gii來(lái)生成我們的Model和Controller等文件。

使用Gii

Gii作為Yii的一大特性,很多人喜歡Yii可能就是因?yàn)檫@個(gè),據(jù)說(shuō)底層代碼寫(xiě)得很棒,不過(guò)我還沒(méi)有仔細(xì)看過(guò)源碼。

首先我們來(lái)使用Gii來(lái)為每一個(gè)數(shù)據(jù)表生成一個(gè)Model,這里也就是生成Status這個(gè)模型。

怎么進(jìn)入Gii的使用面板呢?直接在瀏覽器地址欄輸入 http://localhost:8999/gii 訪問(wèn)就可以了。大概是長(zhǎng)這個(gè)樣子:

點(diǎn)擊Model Generator的按鈕,然后在Table Name輸入框填入表名:status

點(diǎn)擊下方Preview 按鈕,就可以看到Y(jié)ii即將幫你生成的文件了models/Status.php,這里需要注意的一個(gè)地方是。因?yàn)樵谏弦黄恼轮形覀兪謩?dòng)創(chuàng)建了一個(gè)Status模型,所以這里請(qǐng)確定你將Overwrite這個(gè)選擇框的小勾勾打上:

然后點(diǎn)擊Generate按鈕,生成的結(jié)果是這樣的:

這時(shí)候打開(kāi)models/Status.php,你會(huì)看到Y(jié)ii會(huì)根據(jù)我們的數(shù)據(jù)表生成的驗(yàn)證規(guī)則和表單屬性:

```
 "ID",
            "message" => "Message",
            "permissions" => "Permissions",
            "created_at" => "Created At",
            "updated_at" => "Updated At",
        ];
    }
}


```

Status模型生成好之后,該為它生成相應(yīng)的視圖和控制器了,這時(shí)候需要使用到的是Gii 的CRUD Generator了,即:http://localhost:8999/gii/crud

在這個(gè)頁(yè)面,分別填上對(duì)應(yīng)的數(shù)據(jù):

```
Model Class : appmodelsStatus

Search Model Class : appmodelsStatusSearch

Controller Class : appcontrollersStatusController

View Path : 可以直接留空,默認(rèn)就是 app/views/ControllerID
```

然后點(diǎn)擊Preview預(yù)覽一下,這里還是需要把overwrite勾選上,因?yàn)槲覀兩弦还?jié)也創(chuàng)建了兩個(gè)同名的視圖文件(create.php 和 view.php)

最后還是點(diǎn)擊生成,你會(huì)看到類似下面這個(gè)圖片的內(nèi)容:

到了這里,我們基本上可以感覺(jué)到Gii的強(qiáng)大了,生成代碼簡(jiǎn)直都不算事。這時(shí)候如果我們?cè)L問(wèn)http://localhost:8999/status ,你會(huì)看到一個(gè)默認(rèn)的Status的CRUD頁(yè)面,因?yàn)槲覀兊臄?shù)據(jù)庫(kù)里面還沒(méi)有任何數(shù)據(jù),所以這里看到的都是空的:

如果你還記得我們?cè)谏弦黄趯?dǎo)航欄創(chuàng)建的create導(dǎo)航,點(diǎn)擊create,你就會(huì)看到類似下面這個(gè)頁(yè)面一樣的內(nèi)容:

到這里,有沒(méi)有覺(jué)得Gii實(shí)在太厲害了!要是上一篇我們直接用Gii來(lái)生成這些代碼,那開(kāi)發(fā)效率實(shí)在不是一般高。

與上一篇的結(jié)合

雖然Gii足夠強(qiáng)大為我們生成了很多代碼,但是現(xiàn)在有一小部分代碼并不符合我們的要求,我們不用這么復(fù)雜。所以下面先來(lái)把代碼先過(guò)過(guò),以便用于滿足我們自己的要求。

首先是對(duì)創(chuàng)建Status的表單進(jìn)行改造,我們并不希望用戶需要輸入createdupdated這兩個(gè)字段,所以注釋掉/views/Status/_form.php中的下面的代碼:

```
field($model, "created_at")->textInput() ?>

field($model, "updated_at")->textInput() ?>

```

然后permissions字段輸入我們希望這是一個(gè)下拉選擇框,還是在同一個(gè)文件中修改:

```
field($model, "permissions")->dropDownList($model->getPermissions(), 
             ["prompt"=>"- Choose Your Permissions -"]) ?>

```

我們把原來(lái)permissionstextInput換成了上面的dropDownList,這里的dropDownList使用到getPermissions()這個(gè)方法,但是由于剛剛在生成Status這個(gè)模型的時(shí)候我們覆蓋了原諒的Status,所以我們還是需要加上getPermissions()這個(gè)方法:

```
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";        
      }
    }

```

像上一篇提到的一樣,我們將這些代碼又寫(xiě)到了Status.php這里。然后刷新一下:http://localhost:8999/status/create

到這里,我們的表單改造舊完成了,跟我們之前的長(zhǎng)得差不多了。但是這還沒(méi)有完,因?yàn)槲覀冞€需要對(duì)我們的controllers/StatusController.php做一些些小改動(dòng),主要是在actionCreate的改動(dòng):

```
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,
        ]);
    }

```

在這里,我們添加下面這兩行來(lái)保障我們?cè)诓迦霐?shù)據(jù)的時(shí)候,created_atupdated_at不為空。

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

```

這里也是根據(jù)$model->load(Yii::$app->request->post())判斷是否有post數(shù)據(jù)過(guò)來(lái),然后如果數(shù)據(jù)成功保存到數(shù)據(jù)庫(kù),我們就使用return $this->redirect(["view", "id" => $model->id])重定向到view方法(controllers/StatusController.php的actionView方法)。我們填上一些數(shù)據(jù),然后創(chuàng)建一個(gè)status試試,不出意外你會(huì)看到這個(gè)可愛(ài)的頁(yè)面:

終于到了這里了,我們現(xiàn)在再來(lái)修改一下我們的導(dǎo)航,在Status這個(gè)下來(lái)菜單下,我們?cè)黾右粋€(gè)菜單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"]],然后我們的導(dǎo)航欄就是這樣的了:

點(diǎn)擊下拉菜單的View,然后我們就會(huì)來(lái)到:http://localhost:8999/status/index ,這里我們可以看到下面的頁(yè)面了:

這個(gè)視圖文件位于views/status/index.php,如果你想修改一下,你可以直接修改這個(gè)文件。

啊,感覺(jué)這一篇文章的路走得好長(zhǎng),不過(guò)其實(shí)真正編碼的時(shí)間并不過(guò),真正可能也就幾分鐘而已,我們實(shí)現(xiàn)了對(duì)數(shù)據(jù)庫(kù)的一些基本操作和領(lǐng)略Gii的強(qiáng)大。這一篇就先寫(xiě)到這里了,下一篇打算會(huì)寫(xiě)一點(diǎn)關(guān)于用戶注冊(cè)和登錄的基本功能。

  

源碼會(huì)放在 Github:https://github.com/JellyBool/helloYii

Happy Hacking

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/21048.html

相關(guān)文章

  • Yii2系列教程七:Behaviors And Validations

    摘要:原文來(lái)自這一篇文章的開(kāi)頭就無(wú)需多言了,緊接著上一篇的內(nèi)容和計(jì)劃,這一篇我們來(lái)說(shuō)說(shuō)的和。,那既然這樣,我們就來(lái)實(shí)現(xiàn)一下唄。所以我們首先需要將表中的幾條數(shù)據(jù)刪掉。下一節(jié)再詳細(xì)講講吧,這一節(jié)寫(xiě)下來(lái)貌似要說(shuō)的實(shí)在有點(diǎn)多。 原文來(lái)自:https://jellybool.com/post/programming-with-yii2-behaviors-and-validat... 這一篇...

    fasss 評(píng)論0 收藏0
  • yii2 ActiveRecord多表關(guān)聯(lián)以及多表關(guān)聯(lián)搜索的實(shí)現(xiàn)

    摘要:今天把這個(gè)問(wèn)題講明白了,看看是怎么個(gè)多表關(guān)聯(lián)以及如何去優(yōu)化這個(gè)關(guān)聯(lián)。現(xiàn)需要在列表展示表的來(lái)源渠道,且該渠道可搜索。關(guān)聯(lián)表字段增加查詢中的搜索模型也是通過(guò)實(shí)現(xiàn)的,該模型通過(guò)控制著哪個(gè)字段可搜索,哪個(gè)字段不可搜索。 作者:白狼 出處:http://www.manks.top/yii2_many_ar_relation_search.html 本文版權(quán)歸作者,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留...

    venmos 評(píng)論0 收藏0
  • Yii2.0 RESTful API 之版本控制

    摘要:之版本控制之前我寫(xiě)過(guò)兩篇關(guān)于如何搭建,以及認(rèn)證等處理,但是沒(méi)有涉及到版本管理,今天就來(lái)談?wù)劙姹竟芾砣绾螌?shí)現(xiàn)。如果你還沒(méi)有安裝,你可以按照這里的說(shuō)明進(jìn)行安裝。 Yii2.0 RESTful API 之版本控制 之前我寫(xiě)過(guò)兩篇關(guān)于 Yii2.0 RESTful API 如何搭建,以及 認(rèn)證 等處理,但是沒(méi)有涉及到版本管理,今天就來(lái)談?wù)劙姹竟芾砣绾螌?shí)現(xiàn)。 索性就從頭開(kāi)始一步一步搭建吧,但是關(guān)...

    _ang 評(píng)論0 收藏0
  • Yii2系列教程四:實(shí)現(xiàn)用戶注冊(cè),驗(yàn)證,登錄

    摘要:開(kāi)始使用郵箱配置好了之后,我們就可以開(kāi)始使用了,首先我們來(lái)修改一下我們的導(dǎo)航欄,因?yàn)槲覀兿雽?shí)現(xiàn)的就是我們常常看到的在導(dǎo)航欄的右側(cè)的注冊(cè)和登錄按鈕。 原文來(lái)自: https://jellybool.com/post/programming-with-yii2-integrating-user-regi... 本來(lái)打算昨晚寫(xiě)的這篇教程,但是忙著約會(huì)去了,所以現(xiàn)在補(bǔ)上吧。 上一篇...

    boredream 評(píng)論0 收藏0
  • yii2 框架使用gii工具創(chuàng)建模塊

    摘要:配置模塊在文件中加入以下代碼來(lái)配置模塊判斷在開(kāi)發(fā)模式下開(kāi)啟和工具開(kāi)發(fā)環(huán)境工具管理工具使用工具創(chuàng)建模塊瀏覽器輸入地址,打開(kāi)工具創(chuàng)建模塊使用模塊在配置文件中加入新建模塊的配置支付模塊默認(rèn)模塊路徑我是模塊調(diào)用模塊控制器調(diào)用在任意控制器加入以下 配置模塊 在main-local.php文件中加入以下代碼來(lái)配置模塊 # 判斷在開(kāi)發(fā)模式下開(kāi)啟GII和debug工具 if (!YII_ENV_TES...

    james 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<