Heim > PHP-Framework > Laravel > 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)

不言
Freigeben: 2018-10-18 14:33:50
nach vorne
10611 Leute haben es durchsucht

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,
    ]);
}])
// 更多查询省略...
Nach dem Login kopieren

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为空的数据
  }
Nach dem Login kopieren

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
Nach dem Login kopieren

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');
        }])-> // ...
Nach dem Login kopieren

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)
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:segmentfault.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage