Maison  >  Article  >  développement back-end  >  Explication détaillée de l'utilisation de l'association multi-table YII2

Explication détaillée de l'utilisation de l'association multi-table YII2

*文
*文original
2018-01-03 14:37:571805parcourir

Récemment, j'ai rencontré des problèmes liés à l'association multi-tables YII2 dans le projet, et je n'ai pas trouvé d'informations appropriées, j'ai donc réglé le problème moi-même afin de pouvoir m'y référer lorsque j'en aurai besoin à l'avenir ou avec des amis qui en auront besoin il peut s'y référer. Cet article 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. J'espère que cela aide tout le monde.

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

Order

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

1. hasMany et hasOne utilisent

Il existe deux types d'associations entre les tables dans Yii2, qui sont utilisé pour spécifier la relation entre l'association de 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;
Bien sûr Vous pouvez choisir d'utiliser la méthode with, qui semble plus simple. Le paramètre with est le nom de la relation, qui est l'utilisateur dans getUser défini dans le modèle


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

SELECT * FROM order WHERE id=1;
SELECT * FROM user  WHERE user.user_id=order.user_id;

Comme le montre ce qui précède, il existe deux manières d'accéder à une relation

  QuantitySi elle est appelée en tant que fonction, Renverra un objet ActiveQuery ($ Customer-& GT; GetOrders ()-& GT; ALL ())

● Si vous l'appelez dans les attributs, les résultats du modèle seront renvoyés directement ($ Client-& gt; commande)


Cache des résultats de l'association

Si le tableau des commandes change à ce moment-là et que nous souhaitons interroger à nouveau

$user = $order->user;
Récupérer la commande Parfois, vous constaterez qu'il n'y a aucun changement. 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.

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

//先释放缓存
unset($order->user);
$order->user;

requête croisée

Voici le point clé ! 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(), ['user_id' => 'user_id']);
}
 
public function getOrderGoods() {
 return $this->hasMany(OrderGoods::className(), ['order_id' => 'order_id'])->
  via('order');
}

Notez ici : Le deuxième order_id dans getOrderGoods fait référence à la commande associée à getOrder. order_id dans , 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 !

$map = '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';
$list1 = Article::findBySql($map)->asArray()->all();
Il s'agit essentiellement de toute la partie association

Recommandations associées :

Explication détaillée de l'insertion par lots du framework Yii de données Classe d'extension simple

Explication détaillée de la vérification de l'autorisation de l'API restful de yii2

Yii résout le rapport d'erreur de suppression de table de connexion DeleteAll

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!

Déclaration:
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