Laavel에서 쿼리 생성기의 Join을 사용해서 검색 기능을 만들다가 빠졌어요.

4866 단어 Laravel
저는 라벨의 초보자입니다.Eloquentモデル 조회 생성기join()를 사용하여 관련 표의 열을 선별한 후
검색 대상이 아닌 모델의 실례가 한 시간 동안 고민으로 돌아왔다.

총결산

Eloquentモデル 쿼리 생성기join()를 사용하여 인스턴스를 획득한 후
여러 열이 있기 때문id예상 밖의 실례를 되돌아오다.

같은 열 이름이 Laavel 내의 처리에 의해 무시됩니다.
가져오는 열을 압축합니다!

디테일


예를 들면 이런 코드.
$searched_posts = Post::join('comments', 'posts.id', '=', 'comments.posts_id')
  ->where('comments.text', 'like', '%あいうえお%')->get();
Select() 전제는 표와 posts 표에 모두'comments'열이 있다는 것이다.
위 코드가 SQL로 변환되면 이런 느낌일 거예요.
select * from posts 
  inner join comments on posts.id = comments.post_id 
  where comments.text LIKE '%あいうえお%';
SQL의 실행 결과가 다음과 같다고 가정합니다.
id
post_content
id
text
1
아아아아
2
남편
3
엉엉
3
남편
5
읊다, 읊조리다
4
남편
현재id 모델 인스턴스 3개 얻기
제 생각에는 Post 각자 것 같아요. post_content왜 완전히 다른 포스트를 얻었는지 모르겠다.
네.「あああ」「ううう」「おおお」열이 중첩되어 있음id 덮어쓰기posts.idcomments.id,id,23로 모델의 실례로 얻어졌다.

해결책


select에서 추출한 열을 축소합니다.
$searched_posts = Post::select('posts.*')->join('comments', 'posts.id', '=', 'comments.posts_id')
  ->where('comments.text
', 'like', '%あいうえお%')->get();
4와 같이 가져올 열을 줄여서 Post열이 중복되지 않도록 합니다.
이런 관건을 알면 바로 해결할 수 있고, 모르면 쉽게 빠져들기 쉽다.
라벨을 기억할 때 적당한 포인트를 먼저 파악하고 싶어요
검색어 생성기 Join을 사용해서 검색하는 건 좀 아닌 것 같아요.
더 좋은 방법이 있으면 알려주세요.select('posts.*') 사용해도 될까요?
Post::whereHas('Comment', function($comment){
    $comment->where('text', 'like', '%あいうえお%');
이상, 도움이 되었으면 좋겠습니다.

참고 자료


laavel의 조회 구축기에서 JOIN이 같은 이름의 값을 덮어쓰는 경우
Laavel Eloquent에 빠지지 않기 위해 궁금한 거.

좋은 웹페이지 즐겨찾기