[英]Laravel 5.2 | query many to many to one
目前,我正在從事一個多領域和語言的項目,其中視頻以不同的標題和描述重復使用。
我與此關系相關的表看起來像
posts >- videos >- videos_tags -< tags
id id id id
domain_id video_id
video_id tag_id
當然,我已經創建了模型:具有所有必需關系的帖子,視頻和標簽。
我正在嘗試的事情是通過Tag模型獲取所有帖子,並維護pagination()功能。
我能夠通過視頻模型將所有標簽鏈接到帖子。 但是,當我嘗試反向方式時,我似乎並沒有保留pagination()功能。 我已經嘗試了很多,但似乎找不到正確的解決方案。
我與這段代碼最接近(我認為):
// App\Models\Tag
public function posts()
{
$posts = [];
foreach ($this->videos as $video)
{
foreach ($video->posts as $post)
{
if (!array_key_exists($post->id, $posts)) $posts[$post->id] = $post;
}
}
return \Illuminate\Database\Eloquent\Collection::make($posts);
}
歡迎我在尋求答案時錯過的任何建議或文章:)
在問了這個問題之后,我立刻有一個尤里卡的時刻,找到了解決方案。 實現此目的的方法不是通過Tag模型獲取Post模型,而是通過Post模型本身。
這是我所做的:
// App\Models\Tag
public function posts()
{
return Post
::select('posts.*')
->join('videos', 'posts.video_id', '=', 'videos.id')
->join('videos_tags', 'videos.id', '=', 'videos_tags.video_id')
->join('tags', 'videos_tags.tag_id', '=', 'tags.id')
->where('tags.id', $this->id);
}
這解決了在執行查詢之前查詢多對多關系並保持雄辯的功能的問題。
您可以在Posts模型上定義一個所謂的范圍。
class Post {
/**
* Limit query to posts related to a given tag id.
*
* @param Builder $query The original query
* @param Integer $tag_id The tag id to filter for
* @return Builder The query with an additional where
*/
public function scopeHasTag($query, $tag_id)
{
// assumes that there is a 'tags' relation
return $query->whereHas('tags', function($tags_query) use ($tag_id) {
return $tags_query->where('id', $tag_id);
});
}
}
該范圍使您可以執行如下查詢( hasTags
是從scopeHasTags
怪誕地派生的)。
$posts = Post::query()->hasTag(10); // All posts related with tag id 10
return $posts->paginate();
這是有關查詢范圍的官方文檔: https : //laravel.com/docs/5.2/eloquent#local-scopes
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.