Heim  >  Artikel  >  PHP-Framework  >  Der Unterschied zwischen has und with im Laravel-Assoziationsmodell (ausführliche Einführung)

Der Unterschied zwischen has und with im Laravel-Assoziationsmodell (ausführliche Einführung)

不言
不言nach vorne
2018-10-18 14:33:5010588Durchsuche

Der Inhalt dieses Artikels befasst sich mit dem Unterschied zwischen has und with im Laravel-Assoziationsmodell (ausführliche Einführung). Ich hoffe, dass er für Sie hilfreich ist.

Schauen Sie sich zunächst den Code an:

$userCoupons = UserCoupons::with(['coupon' => function($query) use($groupId){
    return $query->select('id', 'group_id', 'cover', 'group_number', 'group_cover')->where([
        'group_id' => $groupId,
    ]);
}])
// 更多查询省略...

Die Datenstruktur besteht aus drei Tabellen: Benutzer-Coupon-Tabelle (user_coupons), Coupon-Tabelle (Coupons), Händlertabelle (Corps) und Gruppe Coupons-Tabelle (group_coupons) (die letzten beiden Elemente wurden zur besseren Anzeige entfernt)

Hier wollte ich ursprünglich die Modellzuordnung verwenden, um alle Daten herauszufinden, die zur angegebenen Gruppen-GourpId in den Benutzer-Coupons gehören ( wenn es leer ist, werden die Daten nicht zurückgegeben).

Aber einige Ergebnisse sind nicht das, was ich will:

  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为空的数据
  }

Einige der Coupons in den Datensätzen sind erfasst, andere sind leer. Denken Sie darüber nach, es handelt sich lediglich um das sogenannte Vorladen, das mithilfe von in() von SQL implementiert wird. Unabhängig davon werden die wichtigsten user_coupons-Daten aufgelistet.

Es wird zwei SQL-Abfragen geben, die erste prüft die Hauptdaten, die zweite prüft die Zuordnung. Die zweite SQL lautet hier wie folgt:

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

Wenn die zweite leer ist, Das dem Hauptdatensatz zugeordnete Feld ist NULL.

Später habe ich gesehen, dass die has()-Methode des zugehörigen Modells has() auf der vorhandenen zugehörigen Abfrage basiert. Unten verwenden wir whereHas() (die gleiche Funktion, nur fortgeschrittener, praktischer zum Schreiben von Bedingungen).

Hier besteht unsere Idee darin, in der ersten Abfragelogik zu beurteilen, ob Coupondaten vorhanden sind, damit wir leere Datensätze herausfiltern können.

Der Code nach dem Hinzufügen von whereHas() lautet wie folgt

    $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');
        }])-> // ...

Sehen Sie sich die endgültige SQL an:

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)

Hier wird tatsächlich exist() zum Filtern vorhandener Datensätze verwendet. Fahren Sie dann mit dem nächsten Schritt der with()-Abfrage fort. Da zu diesem Zeitpunkt alles gefiltert wurde, kann mit die Bedingung entfernt werden.

Natürlich ist es wichtig, zwischen den beiden Funktionen zu unterscheiden, insbesondere in Listen. Es ist nicht erforderlich, leere Daten gezielt herauszufiltern, und das Paginieren ist einfach.

Das obige ist der detaillierte Inhalt vonDer Unterschied zwischen has und with im Laravel-Assoziationsmodell (ausführliche Einführung). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen