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, ]); }]) // 更多查询省略...
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为空的数据 }
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
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'); }])-> // ...
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)
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!