Maison > cadre php > Laravel > le corps du texte

La différence entre has et with dans le modèle d'association Laravel (introduction détaillée)

不言
Libérer: 2018-10-18 14:33:50
avant
10610 Les gens l'ont consulté

Le contenu de cet article porte sur la différence entre has et with dans le modèle d'association Laravel (introduction détaillée). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Premier coup d'œil au code :

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

La structure des données est composée de trois tables : table de coupons utilisateur (user_coupons), table de coupons (coupons), table marchand (corps), Tableau des coupons de groupe (group_coupons) (les deux derniers éléments ont été supprimés pour faciliter la visualisation)

Ici, j'avais initialement prévu d'utiliser l'association de modèles pour connaître toutes les données appartenant au groupe gourpId donné dans les coupons utilisateur ( si elle est vide, cette entrée Data ne sera pas renvoyée).

Mais certains résultats ne correspondent pas à ce que je souhaite :

  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为空的数据
  }
Copier après la connexion

Certains des coupons contenus dans les enregistrements sont enregistrés et certains sont vides. Pensez-y, c'est juste ce qu'on appelle le préchargement implémenté à l'aide de in() de SQL. Peu importe ce que les principales données user_coupons seront répertoriées.

Il aura deux requêtes SQL, la première vérifie les données principales et la seconde vérifie l'association. Ici, le deuxième SQL est le suivant :

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
Copier après la connexion

Si le second est. vide, Le champ associé de l'enregistrement principal est NULL.

Plus tard, j'ai vu la méthode has() du modèle associé de Laravel. has() est basée sur la requête associée existante ci-dessous (la même fonction, juste plus avancée, pratique pour écrire des conditions).

Ici, notre idée est de juger s'il existe des données de coupon dans la première logique de requête, afin que nous puissions filtrer les enregistrements vides.

Le code après avoir ajoutéwhereHas() est le suivant

    $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');
        }])-> // ...
Copier après la connexion

Regardez le SQL final :

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)
Copier après la connexion

Ici, il utilise en fait exist() pour filtrer l'existence Enregistrer. Passez ensuite à l'étape suivante de la requête with(). Comme tout a été filtré à ce stade, with peut supprimer la condition.

Évidemment, il est important de faire la distinction entre les deux fonctions, notamment dans les listes. Il n'est pas nécessaire de filtrer spécifiquement les données vides et la pagination est simple.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal