게시판에서 댓글작성자 검색을 할 때,
해당 댓글 작성자가 포함된 게시글을 출력하는 케이스
일반 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 . '%');
});
}
반응형
'Laravel' 카테고리의 다른 글
[Laravel] route 수정 후 적용 안될 때 (0) | 2021.09.27 |
---|---|
[Laravel] where 로 조회한 Builder 한번에 Update 하기 (0) | 2021.09.13 |
[Laravel] API 응답 시 한글이 깨질때 (0) | 2021.09.10 |
[Laravel] Collection 존재 확인 (0) | 2021.08.27 |
[Laravel] Query 실행 분석하기 (0) | 2021.08.09 |