2017-04-25 38 views
2

我有兩張表,本本本章。一本書有很多章節。Laravel雄辯地得到最新一排相關表

Book模型:

public function chapters() { 
    return $this->hasMany(Chapter::class); 
} 

章模型:

public function book() { 
    return $this->belongsTo(Book::class); 
} 

我想用一個這樣的查詢來獲得自己的最新章節書單:

$books = Book::with(['authors', 'categories', 'chapters' => function($q) { 
    $q->orderBy('updated_at', 'desc')->first(); 
}]->get(); 

但不起作用。章節返回一個空數組。如果我刪除在子查詢中的第一個(),它可以正常工作。

有沒有什麼辦法只用一個查詢來做到這一點。我不想獲得所有相關章節,然後保留一個,或者使用多個查詢。我感覺更好的唯一方法是使用加入,是不是?

任何幫助將不勝感激。謝謝!

+0

不,言語應該就夠了。怎麼使用'limit()'或者看看[這裏](http://stackoverflow.com/questions/15229303/is-there-a-way-to-limit-the-result-with-eloquent-orm -of-laravel)。你需要做的是限制'$ q-> orderBy('updated_at','desc')'爲1. – Alex

+0

一本書可能有超過5k章節,我應該取所有它們,內存問題? – trinvh

+0

您需要**將查詢限制爲只有一行。 – Alex

回答

3

因爲關係是單獨的查詢,所以不能爲預先加載的關係添加限制。如果這樣做,這會限制整個關係查詢,它不會作爲每個相關對象的限制。

幸運的是,你的要求可以簡單地用一個額外的關係來實現:

public function latestChapter() { 
    return $this->hasOne(Chapter::class)->latest(); 
} 

現在,而不是急於加載整個chapters關係,你可以貪婪加載新latestChapter關係。

$books = Book::with(['authors', 'categories', 'latestChapter'])->get(); 
+0

奇怪,我之前用函數lastest_chapter(){return $ this-> chapters() - > take(1); }它不起作用。在你的文章中,它應該是hasMany並將結果限制爲take(1)。感謝您的回答! – trinvh

+0

@trinvh我特意將它變成了'hasOne'關係。最新的章節只有一篇,並不多。 – patricus

+0

啊,但在我的情況下,我必須按sort_order列過濾。不管怎樣,謝謝! – trinvh