簡體   English   中英

Laravel 3雄辯的多對多關系

[英]Laravel 3 eloquent many-to-many relationship

我有一個Post模型和一個Tag模型成多對多關系。

當我獲得帖子和所有標簽時,我就使用了它,並且效果很好:

$posts = Post::with(array('tags'))
            ->where('cat_id', '=', $cat->id)
            ->where_published(1)
            ->order_by('created_at', 'desc')
            ->paginate('10');

上面的代碼顯示了最新創建的帖子並對其進行分頁。

我想通過另一種方法實現相同的目的,從標簽開始並獲取由created_at列分頁和排序的帖子列表。

Tag::with(array('posts'))
                ->where('tagname', '=', $tag)
                ->first();

該方法有效,但顯示所有帖子,我希望對它們進行分頁,排序和過濾where_published(1)。

能用雄心勃勃的使用急切加載完成此操作嗎(我已經知道不進行急切加載,但會進行過多查詢)?

我在哪里可以放置過濾器,以及如何對它們進行分頁?

你可以這樣做:

Tag::with(array('posts' => function ($query) {
    $query->where('published', '=', 1);
})->where('tagname', '=', $tag)
->first();

但是,不幸的是,這幾乎是您可以做的所有事情。 到目前為止,尚不支持訂購和大多數其他東西-我解決這個問題的方法是在模型中創建一個函數,如下所示:

public function posts_ordered()
{
    return $this->has_many_and_belongs_to('Post')->order_by('your_field', 'asc');
}

因此,您將在模型中具有posts()的常規功能,但posts_ordered也可以像以下方式使用:

Tag::with('posts_ordered')->where('tagname', '=', $tag)->first();

不幸的是,您不能將變量(據我所試)傳遞給那些函數,因此需要創建單獨的變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM