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 . '%');
});
}
반응형