2013-02-07 72 views
2

我有一个Post模型和一个Tag模型成为多对多的关系。Laravel 3雄辩的多对多关系

当我的职位和所有标签后有我用这个和它的作品只是罚款:

$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

你可以这样做:

 
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_ordered可以使用,如:

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

可惜你不能传递变量(据我都试过)这些功能,因此需要建立单独的。