我有这样的情况。有authors
和books
。 books
属于authors
而authors
属于books
。
还有另一个表格publish_year
,其中不同年份primary keys
对其进行投射。即2005年有主键1,2006年有主键2等。
现在,在书籍表上,year_id
是引用foreign key
表的primary key
的{{1}}。现在,我希望将publish_year
的所有authors
加载到特定年份(通过管理面板激活)。
我开发了以下雄辩的查询。模型为books
,Author
和Book
。在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();
因此,我可以从控制器中抽象出实现细节。
答案 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()