在Laravel中的每个预先加载的元素上使用Eloquent范围

时间:2015-04-23 07:35:53

标签: php laravel scope eloquent eager-loading

我有这样的情况。有authorsbooksbooks属于authorsauthors属于books。 还有另一个表格publish_year,其中不同年份primary keys对其进行投射。即2005年有主键1,2006年有主键2等。

现在,在书籍表上,year_id是引用foreign key表的primary key的{​​{1}}。现在,我希望将publish_year的所有authors加载到特定年份(通过管理面板激活)。

我开发了以下雄辩的查询。模型为booksAuthorBook。在PublishYear上执行了一些额外的where条件。

query

有效。现在有没有办法在查询中使用范围,如下所示:

return Author::with(['books' => function($query) {
$query->where('year_id', '=', PublishYear::where('is_active', '=', 1)->pluck('id'))
        ->where('is_available', '=', 't')
        ....;
}])->get();

因此,我可以从控制器中抽象出实现细节。

2 个答案:

答案 0 :(得分:2)

我们使用存储库设计模式。

  

存储库在数据源层和业务之间进行调解   应用层。它在数据源中查询数据,   将数据从数据源映射到业务实体,并持续存在   业务实体中的更改到数据源。存储库   将业务逻辑与与底层的交互分开   数据源或Web服务。

Laravel非常支持使用接口的存储库设计。在我们当前的虚拟主机控制面板中,它被广泛用于促进具有多种关系的复杂数据结构。

Ryan Tablada有一篇很好的文章描述了确切的好处:http://ryantablada.com/post/two-design-patterns-that-will-make-your-applications-better

如果您需要更多代码示例,请参阅此heera.it文章,该文章详细介绍了如何实现它:http://heera.it/laravel-repository-pattern

答案 1 :(得分:1)

我在Book模型中声明了一个范围函数,您应该可以在查询中使用它。

<强> book.php中

public function scopePublishingYear($query, $year)
{
    return $query->where('year_id', $year)->where('is_available','t');
}

在你的控制器中:

$year = PublishYear::where('is_active', '=', 1)->pluck('id');

return Author::with(['books' => function($query) use($year) {
    $query->publishingYear($year);
}

但是,正如Luceos所说,如果你想保持你的控制器更清洁,你可以使用存储库模式,并能够写出这样的东西:

return $this->authorRepository->getWithBooks()