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 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
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']); } }
1. HasMany et hasOne utilisent
Utilisation associée
//获取订单信息 $order = Order::findOne(1); //根据订单信息获取到用户信息 $user = $order->user;
//返回订单信息(包括用户信息) $order = Order::find(1)->with('user'); //或者 $order = Order::find(1)->getUser();
SELECT * FROM order WHERE id=1; SELECT * FROM user WHERE user.user_id=order.user_id;
●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
Si tel est le cas, le tableau de commande a changé. Nous espérons que si nous l'interrogeons à nouveau
$user = $order->user;
Et si vous souhaitez réexécuter SQL ? Vous pouvez exécuter
//先释放缓存 unset($order->user); $order->user;
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.
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 : 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 !
$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();
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!