Laravel 3雄辩的多对多关系

时间:2013-02-07 02:31:11

标签: laravel eloquent laravel-3

我将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)。

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

我可以在哪里进行过滤以及如何对它们进行分页?

1 个答案:

答案 0 :(得分: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();

不幸的是你不能将变量(就我已经尝试过的那样)传递给那些函数,因此需要创建单独的函数。