2015-06-16 50 views
2

我正在與PostTag之間的關係使用laravel belongsToManyLaravel通過多個標籤獲取帖子

我想要做的是得到所有Post s它有多個標籤。

我已經嘗試了各種雄辯的查詢,但我無法得到它。

目前我可以得到一個post_idtag_id的數組,如下所示,但必須有一個更簡單的方法來做到這一點。

if (Request::has('tags')) { 
    $tags = Tag::find(explode(',', Request::get('tags'))); 
}else{ 
    $tags = null; 
} 
// Get all posts tagged with the tags 
$jobs = \DB::table('post_tag'); 
foreach ($tags as $tag) { 
    $posts = $posts->orwhere('tag_id', $tag->id); 
} 
dd($posts->get()); 

這轉儲有任何標識的所有帖子的數組,但我需要的post_id S其中包含的所有tag_id秒的陣列。

在此先感謝!

回答

6

Post模型上使用whereHas()是一個好主意,以便加載標籤並只獲得至少具有其中一個標籤的Post

$posts = Post::whereHas('tags', function($q) use ($tags) 
{ 
    $q->whereIn('id', $tags); 
})->get(); 

這裏,$tags只是一個標籤ID的數組。 $posts將是PostCollections。要獲得ID的從它的數組,你可以簡單地做到這一點...

$ids = $posts->lists('id'); 

,而不是調用get()原本或者,使用...->lists('id')

編輯

如果您正在尋找對於僅包含所有標籤的Post s,您想要將一些附加參數傳遞給whereHas函數。

$posts = Post::whereHas('tags', function($q) use ($tags) 
{ 
    $q->whereIn('id', $tags); 
}, '=', count($tags))->get(); 

會發生什麼事是它只會搶有一些附加等於標籤陣列中的標籤的計數標籤的帖子。

如果您使用此方法,請確保您的數據透視表管理正確,因爲不可能多次將某個標記附加到某個模型。

+0

感謝您的意見。有關如何獲取包含'$ tags'中所有標籤的帖子的想法?您的想法非常適用於獲取至少有一個標籤的所有帖子。我是否應該遍歷每個'tag_id'並縮小查詢範圍?在這一點上,我只是想讓它工作,但我認爲有一個相對簡單的laravel方式來做到這一點。 –

+0

是的,有一個很好的方法來做到這一點,whereHas'需要一些額外的參數來處理這件事,我會更新我的答案。 – user3158900

+0

太棒了!非常感謝!您更新的答案正是我所需要的。我試圖儘可能遵循laravel標準,所以我正確地附加和同步標籤。再次感謝! –