摘要:編輯遷移文件我們為表格添加了外鍵,同時生定義了約束,該約束允許刪除父表文章的時候,自動刪除關聯的子表評論。關聯中文文檔的輔助函數列表中文文檔
本節將學習 Eloquent Relations,表與表之間存在著多種關系,舉例如下:
一對一:文章與作者
一對多:文章與評論
多對多:標簽與文章
文章與評論的一對多關系一對多關系,主要理解兩點:
如何實現一對多關系
實現了之后能給開發帶來什么便利
一對多關系實現首先創建 comments 相關:
$ php artisan make:model Comment -mc
同樣,為了遵循以前的約定,把生成的 CommentController 改成復數形式。
編輯遷移文件:
/database/migrations/2017_04_15_062905_create_comments_table.php public function up() { Schema::create("comments", function (Blueprint $table) { $table->increments("id"); $table->unsignedInteger("post_id"); $table->string("body"); $table->timestamps(); $table->foreign("post_id") ->references("id") ->on("posts") ->onDelete("cascade"); }); }
我們為 comments 表格添加了 post_id 外鍵,同時生定義了 onDelete cascade 約束,該約束允許刪除父表(文章)的時候,自動刪除關聯的子表(評論)。
最后,執行遷移:
$ php artisan migrate
接下來,我們就可以定義文章與評論的一對多關系了:
/app/Post.php public function comments() { return $this->hasMany(AppComment::class); }
在 comments 方法中,我們并沒有指定對應的外鍵,這是因為我們在定義遷移的時候,嚴格按照約定 (posts_id),因此 Laravel 會去自動尋找對應的外鍵。::class 方法也可以寫成:
return $this->hasMany("AppComment");一對多關系的作用
定義好了文章與評論的一對多關系之后,我們就可以方便的進行相關操作了,先來練習下:
$ php artisan tinker
為了方便操作,我們先允許評論內容 body 字段批量賦值:
/app/Comment.php protected $fillable = ["body"];
首先是根據文章來直接創建評論:
>>> $post = AppPost::first() >>> $post->comments()->create(["body"=>"評論1"]) >>> $post->comments()->create(["body"=>"評論2"])
可以發現,我們可以根據文章的實例來直接創建對應的評論,而且不需要去確定評論post_id 字段。
創建好之后,我們可以方便的獲取文章的評論:
>>> $post->comments;
我們傳入的是 comments 屬性而不是方法,Laravel 會返回該文章對應評論的集合,比如我們可以將其轉化為其他格式:
>>> $post->comments->toJson()
當然了,也可以使用 comments() 方法返回 Eloquent 模型,再進行進一步操作:
>>> $post->comments()->get()->toArray() >>> $post->comments()->pluck("body")
同樣的,如果我們要根據評論來操作相關文章,我們需要先定義評論與文章的多對一關系:
/app/Comment.php public function post() { return $this->belongsTo(AppPost::class); }
重啟 tinker:
>>> $comment = AppComment::first() >>> $comment->post; >>> $comment->post->title;評論的顯示與創建 顯示評論
顯示評論,比較簡單,直接使用 `Bootstrap 的 card 模板即可:
/resources/views/posts/show.blade.php@foreach ($post->comments as $comment){{ $post->title }}
{{$post->body}}
{{$comment->created_at->diffForHumans() }}{{ $comment->body }}
@endforeach
同時,我們使用了 Carbon 的 diffForHumans 方法,用來顯示「距離現在多久」。
創建評論最后是評論的創建,首先是視圖,放在顯示評論下方即可:
/resources/views/posts/show.blade.php添加評論
對應的路由:
Route::post("/posts/{post}/comments","CommentsController@store");
最后是控制器:
validate(request(),[ "body" => "required|min:5" ]); $post->addComment(request("body")); return back(); } }
首先,依舊是使用路由模型的自動綁定功能,然后將添加評論的方法進行封裝,方便重復使用:
/app/Post.php public function addComment($body) { $this->comments()->create(compact("body")); }
最后使用輔助方法 back(),該方法生成一個重定向響應讓用戶返回到之前的位置。
Eloquent: 關聯 | Laravel 5.4 中文文檔
Cards · Bootstrap
Laravel 的輔助函數列表 | Laravel 5.4 中文文檔
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22749.html
摘要:本節將實現文章評論與用戶關聯的功能。關系定義首先修改與表,增加字段增加全部回滾并重新執行遷移添加用戶表與文章表評論表的一對多關系添加文章評論表與用戶表的多對一關系同時,評論表的字段增加。同時,我們還自定義了返回的錯誤信息。 本節將實現文章、評論與用戶關聯的功能。 關系定義 首先修改 posts 與 comments 表,增加 user_id 字段 /database/migratio...
摘要:將上述的一系列查詢進行封裝模型到了這一步,我們基本上實現了文章歸檔的功能。但是有一個問題,文章歸檔實際上包括在通用視圖中,這就意味著,網站的所有請求都需要返回,否則就會報錯。數據庫之數據庫請求構建器中文文檔的視圖功能中文文檔 首先,要實現的是按照日期來統計文章,原始的 SQL 如下: select year(created_at) year, monthname(c...
摘要:為的輔助方法,用于截取字符串的前個字符,然后返回前個字符加的格式。顯示某篇文章顯示某篇文章的比較簡單,路由注意要放在下面,假如這樣那么,我們訪問的時候,會被當成是的查詢參數。 文章的顯示功能比較簡單,分為兩部分: 文章列表 具體的某篇文章 顯示文章列表 路由之前已經定義好: Route::get(/posts,PostsController@index); 控制器: public ...
摘要:基本功能創建文章的第一步是用戶發請求,然后返回創建文章的頁面。實際上,會報錯添加保護雖然我們完成了基本功能,但是提交請求的時候還是會報錯,其實這是防止攻擊。假如違反了規則,錯誤信息會自動被保存在閃存的中,即只對下一次請求生效。 基本功能 創建文章的第一步是用戶發請求,然后返回創建文章的頁面。 路由:處理用戶「創建文章」的請求 /routes/web.php Route::get(/po...
摘要:熟悉了路由與視圖的基本操作之后,我們來讓視圖顯示一個任務列表吧。創建遷移現在,我們就可以創建一個用來生成任務表的遷移了。 熟悉了路由與視圖的基本操作之后,我們來讓視圖顯示一個任務列表吧。主要知識點: 數據遷移 查詢構造器 數據庫 創建數據庫 首先創建一個數據庫: $ mysql -uroot -p mysql> create database laratasks; 數據庫配置 La...
閱讀 1751·2021-09-28 09:43
閱讀 1111·2021-09-23 11:22
閱讀 2707·2021-09-14 18:05
閱讀 1823·2019-08-30 15:52
閱讀 2812·2019-08-30 10:55
閱讀 2007·2019-08-29 16:58
閱讀 1323·2019-08-29 16:37
閱讀 3031·2019-08-29 16:25