2017-04-25 5 views
2

두 테이블이 있습니다. 한 권의 책에는 많은 장이 있습니다.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()을 제거하면 제대로 작동합니다.

하나의 쿼리만으로이 작업을 수행 할 수있는 방법이 있습니까? 나는 관련된 모든 장을 하나 가지고 있거나 여러 개의 쿼리를 사용하고 싶지 않습니다. 기분이 좋은 유일한 방법은 입니다.에 참여하는 것이 맞습니까?

도움이 될 것입니다. 감사!

+0

아니요, 뚜렷해야합니다. 'limit()'을 사용하거나 어쩌면보세요 (here) (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 관계.

+0

이상한, 나는 함수를 lastest_chapter() {return $ this-> chapters() -> take (1); } 작동하지 않습니다. 게시물에서, 그것은 hasMany이고 take (1)로 결과를 제한해야합니다. 답변 해 주셔서 감사합니다. – trinvh

+0

@trinvh 특별히'hasOne' 관계로 만들었습니다. 최신 장은 하나가 아니라 많지 않습니다. – patricus

+0

아,하지만 제 상황에서는 sort_order 열을 기준으로 필터링해야합니다. 어쨌든 감사합니다! – trinvh