이 기사의 내용은 Laravel 연관 모델에서 has와 with의 차이점에 대한 것입니다(상세 소개). 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
코드를 먼저 살펴보세요:
$userCoupons = UserCoupons::with(['coupon' => function($query) use($groupId){ return $query->select('id', 'group_id', 'cover', 'group_number', 'group_cover')->where([ 'group_id' => $groupId, ]); }]) // 更多查询省略...
데이터 구조는 세 개의 테이블입니다: 사용자 쿠폰 테이블(user_coupons), 쿠폰 테이블(coupons), 판매자 테이블( corps ), 그룹 쿠폰 테이블(group_coupons) (보기의 편의를 위해 마지막 두 항목은 제거되었습니다.)
여기서 원래 모델 연관을 사용하여 주어진 그룹에 속한 모든 데이터를 찾으려고 했습니다. 사용자 쿠폰의 gourpId(비어 있으면 데이터가 반환되지 않습니다).
하지만 일부 결과는 내가 원하는 것과 다릅니다:
array(20) { ["id"]=> int(6) ["user_id"]=> int(1) ["corp_id"]=> int(1) ["coupon_id"]=> int(4) ["obtain_time"]=> int(1539739569) ["receive_time"]=> int(1539739569) ["status"]=> int(1) ["expires_time"]=> int(1540603569) ["is_selling"]=> int(0) ["from_id"]=> int(0) ["sell_type"]=> int(0) ["sell_time"]=> int(0) ["sell_user_id"]=> int(0) ["is_compose"]=> int(0) ["group_cover"]=> string(0) "" ["is_delete"]=> int(0) ["score"]=> int(100) ["created_at"]=> NULL ["updated_at"]=> NULL ["coupon"]=> NULL // 注意返回了coupons为空的数据 }
기록에 있는 일부 쿠폰에는 기록이 있고 일부는 비어 있습니다. SQL의 in()을 사용하여 구현된 소위 사전 로드라고 생각해보세요. 주요 user_coupons 데이터가 무엇이든 나열됩니다.
두 개의 SQL 쿼리가 있는데 첫 번째는 기본 데이터를 확인하고 두 번째는 연결을 확인합니다. 두 번째 SQL은 다음과 같습니다.
select `id`, `group_id`, `cover`, `group_number`, `group_cover` from `youquan_coupons` where `youquan_coupons`.`id` in (1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 13, 14) and (`group_id` = 1) and `youquan_coupons`.`deleted_at` is null
두 번째는 하나는 비어 있고 기본 레코드의 관련 필드는 NULL입니다.
나중에 Laravel의 연관 모델의 has() 메소드를 보았습니다. has()는 기존 연관 쿼리를 기반으로 합니다. 아래에서는 whereHas()를 사용합니다(동일한 효과, 좀 더 발전되어 작성하기에 편리함) 조건)# 🎜🎜#
여기서 우리의 아이디어는 쿠폰 데이터가 있는지 여부에 대한 판단을 첫 번째 쿼리 로직에 넣어 빈 레코드를 필터링할 수 있도록 하는 것입니다. whereHas()를 추가한 후의 코드는 다음과 같습니다$userCoupons = UserCoupons::whereHas('coupon', function($query) use($groupId){ return $query->select('id', 'group_id', 'cover', 'group_number', 'group_cover')->where([ 'group_id' => $groupId, ]); })->with(['coupon' => function($query) use($groupId){ return $query->select('id', 'group_id', 'cover', 'group_number', 'group_cover'); }])-> // ...최종 SQL을 보면:
select * from `youquan_user_coupons` where exists (select `id`, `group_id`, `cover`, `group_number`, `group_cover` from `youquan_coupons` where `youquan_user_coupons`.`coupon_id` = `youquan_coupons`.`id` and (`group_ids` = 1) and `youquan_coupons`.`deleted_at` is null) and (`status` = 1 and `user_id` = 1)여기는 실제로 presents()를 사용하여 필터링하고 있습니다. 기록이 존재합니다. 그런 다음 with() 쿼리의 다음 단계로 이동합니다. 현재 모든 항목이 필터링되었으므로 조건을 제거할 수 있습니다. 분명히 두 기능을 구별하는 것이 중요합니다. 특히 목록에서는 빈 데이터를 특별히 필터링할 필요가 없으며 페이징도 쉽습니다.
위 내용은 Laravel 연관 모델에서 has와 with의 차이점(상세 소개)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!