Maison > développement back-end > tutoriel php > Exemples détaillés de fonctionnement d'associations multi-tables dans YII2

Exemples détaillés de fonctionnement d'associations multi-tables dans YII2

黄舟
Libérer: 2023-03-14 11:24:02
original
1360 Les gens l'ont consulté

Récemment, j'ai rencontré des problèmes liés à l'association multi-tables YII2 au travail. J'ai constaté qu'il n'y avait pas beaucoup d'informations sur cet aspect sur Internet, j'ai donc pensé à faire le tri moi-même pour pouvoir m'y référer lorsque j'en ai besoin. J'en ai besoin à l'avenir ou les amis qui en ont besoin peuvent s'y référer. L'article suivant vous présente principalement l'utilisation des associations multi-tables dans YII2. Les amis qui en ont besoin peuvent y jeter un œil ci-dessous.

Préface

Cet article donne une brève introduction à la requête associée à plusieurs tables de YII2.0. L'article le présente en détail à travers un exemple de code. Je ne dirai pas grand-chose ci-dessous. Jetons un coup d'œil à l'introduction détaillée :

Tout d'abord, expliquons la structure de la table

Structure des tables

Maintenant, il existe une table de commande, une table d'utilisateur, une table de liste de produits, une table d'inventaire de produits

Dans YII, si vous souhaitez associer directement d'autres tables pour une requête, vous devez d'abord définir leur association dans le modèle

Commande


class Order extends \yii\db\ActiveRecord.{
 
 // 关联函数以get+要关联的数据表名来命名
 // 这是获取下订单的客户
 public function getUser(){
  
  // 第一个参数为要关联的子表模型类名,
  // 第二个参数指定 通过子表的user_id,关联主表的usesr_id字段
  // 这里写清楚点大概意思就是User.user_id => Order.user_id
 return $this->hasMany(User::className(), ['user_id' => 'user_id']);
 }
}
Copier après la connexion

1. HasMany et hasOne utilisent

Il existe deux types. d'associations entre tables dans Yii2, Ils servent à préciser l'association entre deux modèles.

●Un-à-plusieurs : hasMany ●Un-à-un : hasOne


●Résultats de retour : Les résultats de retour de ces deux méthodes sont des objets yiidbActiveQuery (si vous souhaitez renvoie le formulaire final du tableau Standard, pensez à ajouter le paramètre asArray())


●Le premier paramètre : le nom de la classe du modèle associé.


●Le deuxième paramètre : est un tableau, où la clé est l'attribut dans le modèle associé et la valeur est l'attribut dans le modèle actuel.


Utilisation associée

Essayons maintenant d'obtenir une commande


//获取订单信息
$order = Order::findOne(1);
//根据订单信息获取到用户信息
$user = $order->user;
Copier après la connexion
Bien sûr, vous pouvez choisir d'utiliser la méthode with, qui semble plus simple. Le paramètre de with est le nom de la relation, qui est user.

< dans getUser défini dans le modèle. 🎜>


Le code ci-dessus générera et exécutera l'instruction SQL suivante
//返回订单信息(包括用户信息)
$order = Order::find(1)->with(&#39;user&#39;);
//或者
$order = Order::find(1)->getUser();
Copier après la connexion


SELECT * FROM order WHERE id=1;
SELECT * FROM user  WHERE user.user_id=order.user_id;
Copier après la connexion
Comme le montre le. ci-dessus, accéder à Il existe deux méthodes d'association

●S'il est appelé en tant que fonction, un objet ActiveQuery sera renvoyé ($customer->getOrders()->all())

            ●Si appelé en attribut, le résultat du modèle ($customer->orders) sera renvoyé directement


Cache des résultats associé

Si tel est le cas, le tableau de commande a changé. Nous espérons que si nous l'interrogeons à nouveau


vous constaterez qu'il n'y a aucun changement lorsque vous recevrez. la commande à nouveau. La raison en est que la base de données ne sera interrogée que lorsque $order->user est exécuté pour la première fois, et les résultats seront mis en cache et SQL ne sera pas exécuté lors des requêtes suivantes.
$user = $order->user;
Copier après la connexion

Et si vous souhaitez réexécuter SQL ? Vous pouvez exécuter


//先释放缓存
unset($order->user);
$order->user;
Copier après la connexion

Requête croisée
Voici la clé indiquer! Comme vous pouvez le voir sur le diagramme de structure de table ci-dessus, la table User et Order_goods ne sont pas directement liées. Ainsi, si nous voulons savoir quels produits l'utilisateur a acheté en fonction des informations de l'utilisateur, nous devons associer les deux tables via la table Order. Alors que faire ? La première est la couche modèle. Parce que nous vérifions en fonction de l'utilisateur, nous accédons à la couche de modèle Utilisateur pour définir l'association.

Utilisateur


public function getOrder() {
 return $this->hasMany(Order::className(), [&#39;user_id&#39; => &#39;user_id&#39;]);
}
 
public function getOrderGoods() {
 return $this->hasMany(OrderGoods::className(), [&#39;order_id&#39; => &#39;order_id&#39;])->
  via(&#39;order&#39;);
}
Copier après la connexion

Notez ici : getOrderGoods Les deux order_id fait référence au order_id dans la commande associée à getOrder, et le premier order_id fait référence au order_id dans OrderGoods. Mais ! Nous avons également la méthode la plus simple, qui consiste à utiliser des instructions SQL !


Il s'agit essentiellement de toute la partie connexe
$map = &#39;select
  user.name,
  order.id,
  order_goods.goods_id,
  goods.goods_name,
  stock.stock_count
  from user
  LEFT JOIN order   ON order.user_id = user.user_id
  LEFT JOIN order_goods ON order_goods.order_id = order.order_id
  LEFT JOIN goods   ON goods.goods_id = order_goods.goods_id
  LEFT JOIN stock   ON stock.goods_id = goods.goods_id&#39;;

$list1 = Article::findBySql($map)->asArray()->all();
Copier après la connexion

Résumé

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:php.cn
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