>  기사  >  PHP 프레임워크  >  Laravel 연관 모델에서 has와 with의 차이점(상세 소개)

Laravel 연관 모델에서 has와 with의 차이점(상세 소개)

不言
不言앞으로
2018-10-18 14:33:5010587검색

이 기사의 내용은 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제