摘要:但是這還沒有完,因為我們還需要對我們的做一些些小改動,主要是在的改動在這里,我們添加下面這兩行來保障我們在插入數(shù)據(jù)的時候,和不為空。
原文來自:https://jellybool.com/post/programming-with-yii2-working-with-the-data...
上一篇文章我們理了一下Yii2的MVC,Forms和Layouts,這篇文章就直接按照約定來說說Yii2與數(shù)據(jù)庫相關(guān)的一些事情,如果你覺得不夠的話,不急,更具體的用法我會在后續(xù)的教程給出,并且這里也會介紹Yii2的代碼生成工具:強大的Gii。
你可以直接到Github下載項目源碼:https://github.com/JellyBool/helloYii,這樣你就可以直接跟上我的進度了,每一次我寫完一個教程,我都會將代碼push到Github,所以,你想偷懶的話,這是一個不錯的方法。
接著上一篇文章,我們的初衷還是沒有改變:創(chuàng)建一個可以發(fā)表狀態(tài)(status)的web小應(yīng)用,你可以看成是QQ空間的說說的mini版,只不過之前我們沒有將數(shù)據(jù)存在數(shù)據(jù)庫里面而已。
創(chuàng)建一個數(shù)據(jù)庫由于我平時開發(fā)基本都是使用Mysql,而且數(shù)據(jù)庫管理工具我比較喜歡Sequel Pro,所以,我就直接在Sequel Pro里面創(chuàng)建一個hello的數(shù)據(jù)庫。當然,你也可以直接用命令行來創(chuàng)建數(shù)據(jù)庫,大概是這樣的:
CREATE DATABASE hello;
有了數(shù)據(jù)庫之后,我們就可以將我們的Yii應(yīng)用與數(shù)據(jù)庫進行連接了,Yii2的數(shù)據(jù)庫配置文件位于/config/db.php中,我們可以打開它來進行相應(yīng)的配置,請注意根據(jù)自己的實際情況進行相應(yīng)的修改:
``` "yiidbConnection", "dsn" => "mysql:host=localhost;dbname=hello", "username" => "root", "password" => "password", "charset" => "utf8", ]; ```創(chuàng)建Migration
這里直接使用了migration這個單詞,其實我不知道該翻譯成什么才比較確切;所以本文就直接使用migration這個單詞了,如果你知道有特別貼切的翻譯,請大聲對我說。其實migration的最大目的可能就是創(chuàng)建數(shù)據(jù)表了,但是我們?yōu)槭裁催€要使用migration了?這可能都是受到Rails大法的影響,因為這樣的好處其實很多,migration不僅可以讓開發(fā)人員動態(tài)創(chuàng)建和更新一個數(shù)據(jù)庫表的schema,還可以應(yīng)對多個服務(wù)器的時候環(huán)境不同的問題,直接就避免導(dǎo)入sql文件的各種坑。
至于在代碼中我們該怎么命名我們的數(shù)據(jù)表,我比較喜歡的是直接跟Model一樣,如果是單復(fù)數(shù)問題也無所謂,這看個人,所以這里,我會選擇創(chuàng)建一個status表,iTerm命令行執(zhí)行:
``` cd Desktop/helloYii/ ./yii migrate/create create_status_table ```
過程當中會詢問是否創(chuàng)建migration,果斷yes,然后完成之后大概是這樣的:
這條命令會在項目目錄下創(chuàng)建一個migrations/目錄,里面就有剛剛我們創(chuàng)建的migration文件,名字大概是這樣的:m150804_035107_create_status_table.php,然后我們就可以打開這個文件來一睹芳容了:
```嗯,大概就是這樣,up()方法是我們后面執(zhí)行./yii migrate/up命令的時候觸發(fā)的,這里一般都是負責創(chuàng)建一個表,我們可以將表的schema寫在這個方法里面。
創(chuàng)建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就是上一篇我們的文本輸入框輸入的文本內(nèi)容和下拉選擇框的內(nèi)容;這里我們還要兩個created_at和updated_at字段,呃,你可以說我被Laravel洗腦了。
down()方法與up()相對應(yīng),用來刪除數(shù)據(jù)表的,我希望你不會用到。
更多詳細內(nèi)容參考這里:
http://www.yiiframework.com/doc-2.0/guide-db-migrations.html
有了表的schema之后,我們就可以來執(zhí)行我們的migrate命令了,命令行執(zhí)行:
``` ./yii migrate/up ```過程中還是果斷yes,然后完成之后你就可以到到hello數(shù)據(jù)庫去看status表了:
這里你還會看到一個migration的表,這是Yii2的migrate自動生成了,它是用來管理我們自己創(chuàng)建的migration(這里指數(shù)據(jù)表),你可以不用關(guān)心它。
使用Yii2的migrate創(chuàng)建完數(shù)據(jù)表之后,我們下一步就來上手一下Yii2的代碼生成工具Gii了,因為我們會通過Gii來生成我們的Model和Controller等文件。
使用GiiGii作為Yii的一大特性,很多人喜歡Yii可能就是因為這個,據(jù)說底層代碼寫得很棒,不過我還沒有仔細看過源碼。
首先我們來使用Gii來為每一個數(shù)據(jù)表生成一個Model,這里也就是生成Status這個模型。
怎么進入Gii的使用面板呢?直接在瀏覽器地址欄輸入 http://localhost:8999/gii 訪問就可以了。大概是長這個樣子:
點擊Model Generator的按鈕,然后在Table Name輸入框填入表名:status
點擊下方Preview 按鈕,就可以看到Y(jié)ii即將幫你生成的文件了models/Status.php,這里需要注意的一個地方是。因為在上一篇文章中我們手動創(chuàng)建了一個Status模型,所以這里請確定你將Overwrite這個選擇框的小勾勾打上:
然后點擊Generate按鈕,生成的結(jié)果是這樣的:
這時候打開models/Status.php,你會看到Y(jié)ii會根據(jù)我們的數(shù)據(jù)表生成的驗證規(guī)則和表單屬性:
``` "ID", "message" => "Message", "permissions" => "Permissions", "created_at" => "Created At", "updated_at" => "Updated At", ]; } } ```Status模型生成好之后,該為它生成相應(yīng)的視圖和控制器了,這時候需要使用到的是Gii 的CRUD Generator了,即:http://localhost:8999/gii/crud
在這個頁面,分別填上對應(yīng)的數(shù)據(jù):
``` Model Class : appmodelsStatus Search Model Class : appmodelsStatusSearch Controller Class : appcontrollersStatusController View Path : 可以直接留空,默認就是 app/views/ControllerID ```然后點擊Preview預(yù)覽一下,這里還是需要把overwrite勾選上,因為我們上一節(jié)也創(chuàng)建了兩個同名的視圖文件(create.php 和 view.php):
最后還是點擊生成,你會看到類似下面這個圖片的內(nèi)容:
到了這里,我們基本上可以感覺到Gii的強大了,生成代碼簡直都不算事。這時候如果我們訪問http://localhost:8999/status ,你會看到一個默認的Status的CRUD頁面,因為我們的數(shù)據(jù)庫里面還沒有任何數(shù)據(jù),所以這里看到的都是空的:
如果你還記得我們在上一篇在導(dǎo)航欄創(chuàng)建的create導(dǎo)航,點擊create,你就會看到類似下面這個頁面一樣的內(nèi)容:
到這里,有沒有覺得Gii實在太厲害了!要是上一篇我們直接用Gii來生成這些代碼,那開發(fā)效率實在不是一般高。
與上一篇的結(jié)合雖然Gii足夠強大為我們生成了很多代碼,但是現(xiàn)在有一小部分代碼并不符合我們的要求,我們不用這么復(fù)雜。所以下面先來把代碼先過過,以便用于滿足我們自己的要求。
首先是對創(chuàng)建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, ]); } ```在這里,我們添加下面這兩行來保障我們在插入數(shù)據(jù)的時候,created_at和updated_at不為空。
``` $model->created_at = time(); $model->updated_at = time(); ```這里也是根據(jù)$model->load(Yii::$app->request->post())判斷是否有post數(shù)據(jù)過來,然后如果數(shù)據(jù)成功保存到數(shù)據(jù)庫,我們就使用return $this->redirect(["view", "id" => $model->id])重定向到view方法(controllers/StatusController.php的actionView方法)。我們填上一些數(shù)據(jù),然后創(chuàng)建一個status試試,不出意外你會看到這個可愛的頁面:
終于到了這里了,我們現(xiàn)在再來修改一下我們的導(dǎo)航,在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"]],然后我們的導(dǎo)航欄就是這樣的了:
點擊下拉菜單的View,然后我們就會來到:http://localhost:8999/status/index ,這里我們可以看到下面的頁面了:
這個視圖文件位于views/status/index.php,如果你想修改一下,你可以直接修改這個文件。
啊,感覺這一篇文章的路走得好長,不過其實真正編碼的時間并不過,真正可能也就幾分鐘而已,我們實現(xiàn)了對數(shù)據(jù)庫的一些基本操作和領(lǐng)略Gii的強大。這一篇就先寫到這里了,下一篇打算會寫一點關(guān)于用戶注冊和登錄的基本功能。
源碼會放在 Github:https://github.com/JellyBool/helloYii
Happy Hacking
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/21048.html
摘要:原文來自這一篇文章的開頭就無需多言了,緊接著上一篇的內(nèi)容和計劃,這一篇我們來說說的和。,那既然這樣,我們就來實現(xiàn)一下唄。所以我們首先需要將表中的幾條數(shù)據(jù)刪掉。下一節(jié)再詳細講講吧,這一節(jié)寫下來貌似要說的實在有點多。 原文來自:https://jellybool.com/post/programming-with-yii2-behaviors-and-validat... 這一篇...
摘要:今天把這個問題講明白了,看看是怎么個多表關(guān)聯(lián)以及如何去優(yōu)化這個關(guān)聯(lián)?,F(xiàn)需要在列表展示表的來源渠道,且該渠道可搜索。關(guān)聯(lián)表字段增加查詢中的搜索模型也是通過實現(xiàn)的,該模型通過控制著哪個字段可搜索,哪個字段不可搜索。 作者:白狼 出處:http://www.manks.top/yii2_many_ar_relation_search.html 本文版權(quán)歸作者,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留...
摘要:之版本控制之前我寫過兩篇關(guān)于如何搭建,以及認證等處理,但是沒有涉及到版本管理,今天就來談?wù)劙姹竟芾砣绾螌崿F(xiàn)。如果你還沒有安裝,你可以按照這里的說明進行安裝。 Yii2.0 RESTful API 之版本控制 之前我寫過兩篇關(guān)于 Yii2.0 RESTful API 如何搭建,以及 認證 等處理,但是沒有涉及到版本管理,今天就來談?wù)劙姹竟芾砣绾螌崿F(xiàn)。 索性就從頭開始一步一步搭建吧,但是關(guān)...
摘要:開始使用郵箱配置好了之后,我們就可以開始使用了,首先我們來修改一下我們的導(dǎo)航欄,因為我們想實現(xiàn)的就是我們常常看到的在導(dǎo)航欄的右側(cè)的注冊和登錄按鈕。 原文來自: https://jellybool.com/post/programming-with-yii2-integrating-user-regi... 本來打算昨晚寫的這篇教程,但是忙著約會去了,所以現(xiàn)在補上吧。 上一篇...
摘要:配置模塊在文件中加入以下代碼來配置模塊判斷在開發(fā)模式下開啟和工具開發(fā)環(huán)境工具管理工具使用工具創(chuàng)建模塊瀏覽器輸入地址,打開工具創(chuàng)建模塊使用模塊在配置文件中加入新建模塊的配置支付模塊默認模塊路徑我是模塊調(diào)用模塊控制器調(diào)用在任意控制器加入以下 配置模塊 在main-local.php文件中加入以下代碼來配置模塊 # 判斷在開發(fā)模式下開啟GII和debug工具 if (!YII_ENV_TES...
閱讀 2979·2021-09-22 15:18
閱讀 3400·2019-08-30 15:54
閱讀 3279·2019-08-30 15:53
閱讀 597·2019-08-30 14:12
閱讀 820·2019-08-29 17:01
閱讀 2206·2019-08-29 14:04
閱讀 1394·2019-08-29 13:09
閱讀 871·2019-08-26 17:40