2017-04-25 15 views
2

チャプタの2つのテーブルがあります。 1つの本には多くの章があります。Laravel eloquent関連テーブルの最新行を取得

ブックモデル:

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

しかし、動作しません。章は空の配列を返します。サブクエリ内でfirst()を削除すると、正常に動作します。

1つのクエリでこれを行う方法はありますか。私は関連するすべてのチャプターを取得し、1つを保持したり、複数のクエリーを使用したりしたくありません。私がより良く感じる唯一の方法は、に参加することです、そうですか?

ご協力いただければ幸いです。ありがとう!

+0

いいえ、分かりやすいはずです。 'limit()'を使うのはどうでしょう、あるいは見てみてはどうでしょう。(http://stackoverflow.com/questions/15229303/is-there-a-way-to-limit-the-result-with-eloquent-orm 〜の - laravel)。あなたがする必要があるのは、 '$ q-> orderBy( '​​updated_at'、 'desc')を1に制限することです。 – Alex

+0

1つの本は5k章以上あります。 – trinvh

+0

クエリを1行に制限する**必要があります**。 – Alex

答えて

3

リレーションシップは別のクエリであるため、eager loaded relationshipにリミットを追加することはできません。これを行うと、関係クエリ全体が制限され、関連オブジェクトごとに制限として機能しません。

は幸いにも、あなたの条件には、追加の関係を簡単に実装できます。

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'関係にしました。最新の章は1つしかなく、多くはない。 – patricus

+0

ああ、私の状況では、私はsort_orderカラムでフィルタリングする必要があります。とりあえずありがとう! – trinvh

関連する問題