2015-04-23 46 views
2

我有這樣的情況。有authorsbooksbooks屬於authorsauthors有很多books。 還有另一個表publish_year,不同的年份有primary keys反對他們。即2005年具有主鍵1 2006年一年有主鍵2等在Laravel的每個渴望加載的元素上使用Eloquent作用域

現在,書本上的表中,year_id是指publish_year表的primary keyforeign key。現在我想要加載所有的authors和他們的books一個特定的年份(這是從管理面板激活)。

我開發了以下雄辯的查詢。型號爲Author,BookPublishYear。在query上執行一些額外的where條件。

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

它的工作原理。現在有沒有辦法使用範圍的查詢中是這樣的:

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

所以,我可以抽象掉來自控制器的實現細節。

回答

2

我們爲此使用存儲庫設計模式。

存儲庫在數據源層和應用程序的業務層之間進行調解。它向數據源查詢數據, 將來自數據源的數據映射到業務實體,並將業務實體中的更改持續到數據源。存儲庫 將業務邏輯從與底層數據源或Web服務的交互中分離出來。

Laravel對使用接口的存儲庫設計有很大的支持。在我們當前的虛擬主機控制面板中,它被廣泛用於促進我們擁有多重關係的複雜數據結構。

瑞安Tablada有一個很好的文章描述的確切好處:http://ryantablada.com/post/two-design-patterns-that-will-make-your-applications-better

如果你需要更多的代碼示例,請參閱本heera.it一篇文章,去到更多關於如何實現它的細節:http://heera.it/laravel-repository-pattern

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()