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) 上进行分页、排序和过滤。

这可以通过使用预先加载的 eloquent 来完成吗(没有预先加载我已经知道这样做但是会有太多的查询)?

我在哪里可以放置过滤器以及如何让它们分页?

4

1 回答 1

1

你可以这样做:

标签::with(array('posts' => function ($query) {
    $query->where('已发布', '=', 1);
})->where('tagname', '=', $tag)
->第一();

然而,不幸的是,这几乎是你所能做的。目前还不支持订购和大多数其他东西 - 我解决这个问题的方法是在模型中创建一个函数,如下所示:

公共函数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();

不幸的是,您不能将变量(据我尝试过)传递给这些函数,因此需要创建单独的变量。

于 2013-02-08T19:17:59.387 回答