2

多対多の関係にある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)が必要です。

これは、熱心な読み込みを使用して雄弁に行うことができますか(熱心な読み込みなしで、私はすでにそれを行うことを知っていますが、クエリが多すぎます)?

フィルタリングはどこに置くことができ、どのようにページ付けすることができますか?

4

1 に答える 1

1

あなたはこれを行うことができます:

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

ただし、残念ながら、これでできることはほとんどすべてです。注文や他のほとんどのものはまだサポートされていません-これを回避する方法は、次のようにモデルに関数を作成することでした:

パブリック関数posts_ordered()
{{
    $ this-> has_many_and_belongs_to('Post')-> order_by('your_field'、'asc');を返します。
}

したがって、モデルにはposts()の通常の関数がありますが、posts_orderedは次のように使用することもできます。

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

残念ながら、(私が試した限りでは)これらの関数に変数を渡すことはできないため、別の関数を作成する必要があります。

于 2013-02-08T19:17:59.387 に答える