Laravel

[Laravel] with relations 간에 데이터 검색 로직

먹세 2021. 9. 10. 16:50

게시판에서 댓글작성자 검색을 할 때,

해당 댓글 작성자가 포함된 게시글을 출력하는 케이스

 

일반 join query

select * from posts A
LEFT JOIN
comments B
ON
A.id = B.post_id
WHERE
B.name like '%홍길동%';

댓글이 없는 게시글도 있을 수 있기 때문에

게시글은 Full Scan 타지 않게 comments 테이블에 posts 를 LEFT JOIN 했다.

 

 

라라벨 쿼리빌더

<?php
$posts = Post::with('comment')
  ->orderByDesc('updated_at')->orderByDesc('created_at');
  
if ($search_name) {
  $posts->whereHas('comment', function($query) use ($search_name) {
    $query->where('name', 'like', '%' . $search_name . '%');
  });
}

eager 로딩으로 comment가 포함된 posts를 불러오고

검색 내용이 있다면 해당 내용을 whereHas 로 검색 후 결과가 포함된 post들만 반환한다.

 

다수의 테이블을 relationship 으로 가져왔을 때도 whereHas에 관계 설정만 잘 해주면 동일하게 사용 가능

<?php
$posts = Post::with('comment.file', 'user')
  ->orderByDesc('updated_at')->orderByDesc('created_at');
  
if ($search_name) {
  $posts->whereHas('comment', function($query) use ($search_name) {
    $query->where('name', 'like', '%' . $search_name . '%');
  });
}

if ($comment_content) {
  $posts->whereHas('comment', function($query) use ($comment_content) {
    $query->where('content', 'like', '%' . $comment_content . '%');
  });
}

 

반응형