Maison > Article > développement back-end > Explication détaillée de l'utilisation de l'association multi-table YII2
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 tablesMaintenant, il existe une table de commande, une table d'utilisateur, une table de liste de produits, une table d'inventaire de produitsDans 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
Utilisation associée
//获取订单信息 $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
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!