https://laravel.kr/docs/6.x/eloquent-relationships#querying-relationship-existence 

 

    - 각 모델간의 관계를 설정후 , 조인없이 쿼리하기

    - 최종 변환된 쿼리에서 서브 쿼리로 작성됨

 

 

//--------------------------------------------------
< 존재하는 관계에 대한 쿼리 질의하기 >


//-----------------
has (, orHas )

    - comments가 1개 이상인 것
    - sub query
$posts = App\Post::has('comments')->get();


    - comments 모델에 votes 관계가 정의되어 있는 경우 사용가능
$posts = App\Post::has('comments.votes')->get();



    - comments가 3개 이상인 것
$posts = App\Post::has('comments', '>=', 3)->get();



//--------------
*  whereHas (, orWhereHas )
    - has에 where 절 사용


    - comments 모델에서 content_no가 3 이상인것
    기본으로 soft delete가 적용된다soft delete를 적용하지 않으려면 withTrashed() 사용
$posts = App\Post::whereHas('comments', function (Builder $query) {
    $query->where('content_no', '<', 3)->withTrashed();
})->get();


    - comments 모델에서 content_no가 3 이상이고, 그런 comments가 10개 이상
$posts = App\Post::whereHas('comments', function (Builder $query) {
    $query->where(content_no', '<', 3);
}, '>=', 10)->get();




//--------------------------------------------------------
< 관계된 모델이 존재하지 않는 것을 확인하며 질의하기 >
*  doesntHave (, orDoesntHave )
    - where 절 사용 가능
        whereDoesntHave (, orWhereDoesntHave )


    - comments가 없는 것 조회
$posts = App\Post::doesntHave('comments')->get();


    - where 절 사용
$posts = App\Post::whereDoesntHave('comments', function (Builder $query) {
    $query->where('content', 'like', 'foo%');
})->get();

 

Posted by 코덴스

댓글을 달아 주세요