在 Laravel many to many relationship 中, 當我取得 related model, related model 預設會載入中間 model 嗎?
會哦
在 Laravel many to many relationship 中, 當我取得 related model, 自動載入的中間 model 預設只會有什麼資料?
model key
在 Laravel many to many relationship 中, 當我取得 related model, 自動載入的中間 model 預設只會有 model key, 如果我想要讓他自動載入時自動載入其他特定 column 的資料, 我可以怎麼做?
<?php
namespaceApp;
useIlluminate\Database\Eloquent\Model;
classUserextendsModel { /** * The roles that belong to the user. */ publicfunctionroles() { return$this->belongsToMany('App\Role')->withPivot('column1', 'column2'); } }
Answer: 每個 Post 都有一個 Image, 而其他的 model 也可能會用到 Image, 因此使用 polymorphic one to one relation
Laravel 中, 假設我的 Post model 有一個 Image model, 而 User model 也有一個 Image model, 現在我要定義 one to one (polymorphic) relation, 若要在 Post model 中定義與 Image model 的關係, 可以怎麼做?
在 Laravel one to one (Polymorphic) relation 當中, 假設以下為我的 relation 定義, 如果我要從 child model 取得 parent model, 我可以怎麼做?
Relation 定義:
<?php
namespaceApp;
useIlluminate\Database\Eloquent\Model;
classImageextendsModel { /** * Get the owning imageable model. */ publicfunctionimageable() { return$this->morphTo(); } }
取得 relation
<?php $image = App\Image::find(1);
$imageable = $image->imageable;
# One To Many (Polymorphic)
# Table Structure
Laravel 當中, 如果說在我的應用中的 user 可以同時在 video 以及 post 中留下 comments, 那我可以使用怎麼樣的 relation?
one to many (Polymorphic)
Laravel one to many (Polymorphic) 當中, 以下的 table structure 中的 commentable_id 以及 commentable_type 代表什麼?
posts id - integer title - string body - text
videos id - integer title - string url - string
comments id - integer body - text commentable_id - integer commentable_type - string
commentable_id: 代表 foreign key
commentable_type: 代表 relation 的 model name
# Model Structure
Laravel 當中, 假設每一個 Video model 以及 Post model 都有多個 Comment model, 現在我要定義一個 one to many (polymorphic) relation, 若要從 Video model 中定義與 Comment model 的 relation, 可以怎麼做?
<?php
namespaceApp;
useIlluminate\Database\Eloquent\Model;
classVideoextendsModel { /** * Get all of the video's comments. */ publicfunctioncomments() { return$this->morphMany('App\Comment', 'commentable'); } }
Laravel 當中, 假設每一個 Video model 以及 Post model 都有多個 Comment model, 現在我要定義一個 one to many (polymorphic) relation, 若要從 Post model 中定義與 Comment model 的 relation, 可以怎麼做?
<?php
namespaceApp;
useIlluminate\Database\Eloquent\Model;
classPostextendsModel { /** * Get all of the post's comments. */ publicfunctioncomments() { return$this->morphMany('App\Comment', 'commentable'); } }
Answer: Comment model 同時與一個以上的 model 有 belongsTo 的 relation, 所以可以使用 polymorphic relation, 當使用 commentable relation 時, 會經由 commentable_type 以及 commentable_id 取得相對應的 relational model 以及 id
# Retrieving The Relationship
Laravel one to many (Polymorphic) relation 當中, 如果我要從 parent model 取得 child model, 我可以怎麼做? 假設以下為我的 relation 定義
Relation 定義:
<?php
namespaceApp;
useIlluminate\Database\Eloquent\Model;
classCommentextendsModel { /** * Get the owning commentable model. */ publicfunctioncommentable() { return$this->morphTo(); } }
classPostextendsModel { /** * Get all of the post's comments. */ publicfunctioncomments() { return$this->morphMany('App\Comment', 'commentable'); } }
classVideoextendsModel { /** * Get all of the video's comments. */ publicfunctioncomments() { return$this->morphMany('App\Comment', 'commentable'); } }
取得 relation
<?php $post = App\Post::find(1);
foreach ($post->comments as$comment) { // }
在 Laravel one to many (Polymorphic) relation 當中, 假設以下為我的 relation 定義, 現在我要從 child model 取得 parent model, 那我可以怎麼做?
relation 定義:
<?php
namespaceApp;
useIlluminate\Database\Eloquent\Model;
classCommentextendsModel { /** * Get the owning commentable model. */ publicfunctioncommentable() { return$this->morphTo(); } }
classPostextendsModel { /** * Get all of the post's comments. */ publicfunctioncomments() { return$this->morphMany('App\Comment', 'commentable'); } }
classVideoextendsModel { /** * Get all of the video's comments. */ publicfunctioncomments() { return$this->morphMany('App\Comment', 'commentable'); } }
取得 relation
<?php $comment = App\Comment::find(1);
$commentable = $comment->commentable;
# Many To Many (Polymorphic)
# Table Structure
在 Laravel many to many (Polymorphic) relation 當中, 假如說我有 video 跟 post model, 而兩者都跟 tag model 有 many to many 的關係, 那我可以怎樣定義我的 table?
Answer: 定義 Post model 跟 Tag model 之間 polymorphic many to many relation 試想, 一篇 post 可以有多個 tags, 而我也可以經由一個 tag 取得多個 posts, 這樣就構成 many to many relationship 同時, 一部 video 可以有多個 tags, 而我也可以經由一個 tag 取得多部 video, 這樣也構成 many to many relationship 那我需要建立兩個 tags table 以及兩個 pivot table 嗎? 可以使用 polyMorphic many to many relation, 這樣只需要一個 tags table 以及一個 pivot table 就夠了
Answer: 定義 tags 分別與 videos 以及 posts table 之間的 polymorphic many to many relationship 試想, 一篇 post 可以有多個 tags, 而我也可以經由一個 tag 取得多個 posts, 這樣就構成 many to many relationship 同時, 一部 video 可以有多個 tags, 而我也可以經由一個 tag 取得多部 video, 這樣也構成 many to many relationship 那我需要建立兩個 tags table 以及兩個 pivot table 嗎? 可以使用 polyMorphic many to many relation, 這樣只需要一個 tags table 以及一個 pivot table 就夠了
在 Laravel many to many polymorphic relation 當中, 假如我有 Post 跟 Video model, 而兩者都與 Tag model 有 many to many 的 relationship, 現在我要在 Tag 定義 many to many polymorphic relation, 我可以怎麼做?
# Retrieving The Relationship
Laravel many to many polymorphic relationship 當中, 如果我的 relation 定義如下, 現在我要從 Post model 取得 Tag relation, 我該怎麼做?
Relation 定義:
<?php
namespaceApp;
useIlluminate\Database\Eloquent\Model;
classPostextendsModel { /** * Get all of the tags for the post. */ publicfunctiontags() { return$this->morphToMany('App\Tag', 'taggable'); } }
Answer:
<?php $post = App\Post::find(1);
foreach ($post->tags as$tag) { // }
Laravel many to many polymorphic relationship 當中, 如果我的 relation 定義如下, 現在我要從 Tag model 取得 Post relation, 我該怎麼做?
Relation 定義:
<?php
namespaceApp;
useIlluminate\Database\Eloquent\Model;
classTagextendsModel { /** * Get all of the posts that are assigned this tag. */ publicfunctionposts() { return$this->morphedByMany('App\Post', 'taggable'); }
/** * Get all of the videos that are assigned this tag. */ publicfunctionvideos() { return$this->morphedByMany('App\Video', 'taggable'); } }
在 Laravel relationship 當中, 假如我的 Post model 與 Comment model 關聯, 我只要取得有至少一個以上 Comment 的 Post, 且這個 comment 的 content 要含有 ‘foo’, 那我可以怎麼做?
<?php // Retrieve posts with at least one comment containing words like foo%... $posts = App\Post::whereHas('comments', function (Builder $query) { $query->where('content', 'like', 'foo%'); })->get();
在 Laravel relationship 當中, 假如我的 Post model 與 Comment model 關聯, 我只要取得有十個以上 Comment 的 Post, 且 10 個 Comment 的 content 都要含有 ‘foo’, 那我可以怎麼做?
<?php // Retrieve posts with at least ten comments containing words like foo%... $posts = App\Post::whereHas('comments', function (Builder $query) { $query->where('content', 'like', 'foo%'); }, '>=', 10)->get();
# Querying Relationship Absence
在 Laravel relationship 當中, 假如我的 Post model 與 Comment model 關聯, 我要取得沒有任何 comments 的 post, 那我可以怎麼做?
Answer: 取得 Post models, 其 comment relation model 的 content 不包含 ‘foo%’
在 Laravel relationship 中, 假設我有 post, comment, 以及 author Model, 現在我要取得 comment 的 author 未被 banned 的 post (以 post 的 comment 的 author 為條件 query), 那我可以怎麼做?
<?php useIlluminate\Database\Eloquent\Builder;
$posts = App\Post::whereDoesntHave('comments.author', function (Builder $query) { $query->where('banned', 1); })->get();
# Querying Polymorphic Relationships
以下的 Laravel example code 的意思是?
Example:
<?php useIlluminate\Database\Eloquent\Builder;
// Retrieve comments associated to posts or videos with a title like foo%... $comments = App\Comment::whereHasMorph( 'commentable', ['App\Post', 'App\Video'], function (Builder $query) { $query->where('title', 'like', 'foo%'); } )->get();
Answer: 取得 polymorphic many to many relation 的 Post, Video relation, 並從中篩選 title 含有 ‘foo%’ 的 model
在 Laravel polymorphic relationship 當中, 假如 Post 與 Video Model 都有多個 Comment Model, 現在我要取得 comment, 所屬的 video 或 post 的 title 含有 foo%, 那我可以怎麼做?
Laravel 中, 如果今天我的 Comment model 與 video 以及 post 有 polymorphic 的 relation, 那我想要取得 comment, 且該 comment 所屬的 post 的 title 不可含有 foo, 那我可以怎麼做?
<?php // Retrieve comments associated to posts with a title not like foo%... $comments = App\Comment::whereDoesntHaveMorph( 'commentable', 'App\Post', function (Builder $query) { $query->where('title', 'like', 'foo%'); } )->get();
Laravel 中, 假如 Post model, Video model 與 Comment model 有 polymorphic 的關係, 現在我想要取得某些 Comment, 條件是 Video 的 title 必須含有 foo, 而 Post 的 title 或 content 必須含有 foo, 那我可以怎麼做?
Answer: 取出 Post model 的 relation model ‘Votes’, 以及 ‘Comments’ 的數量, 並且, 針對 Comments model 有特別篩選, 條件為 where(‘content, ‘like’, ‘foo%’) 載入後, 可在每一個 Post model 使用 ‘votes_count’ 以及 ‘comments_count’
Laravel relationship 中, 當我使用了 withCount method, Laravel 會在取得的 model 中加入哪一個欄位?
{relation}_count
以下的 Laravel example code 的意思是?
Example:
<?php useIlluminate\Database\Eloquent\Builder;
$posts = App\Post::withCount([ 'comments', 'comments as pending_comments_count' => function (Builder $query) { $query->where('approved', false); }, ])->get();
echo$posts[0]->comments_count;
echo$posts[0]->pending_comments_count;
Answer: 取得兩種 Post model 的 relation Comment model count, 一個有加特定 constraints, 並 alias 為 pending_comments_count
Laravel relationship 中, 假設今天我的 Post model 有 comments 的 relationships, 假如現在我要取得每個 Post 有幾個 comment, 以及我要自定義一個 comment 叫做 pending_comments_count, 條件是該 comment 的 approved 必須是 false, 那我可以怎麼做?
ActivityFood morphTo Event ActivityFood morphTo Photo ActivityFood morphTo Post Event has relation with calendar Photo has relation with tags Post has relation with author 一次性的從 ActivityFeed eager loading 上面的六個 relationships
# Eager Loading Specific Columns
在以下的 Laravel 程式碼中, 如果我只想要 eager load author relation 中的 id 以及 name columns, 我可以怎麼做?
留言