Vor kurzem bin ich bei der Arbeit auf Probleme im Zusammenhang mit der YII2-Mehrtabellenzuordnung gestoßen. Ich habe festgestellt, dass es im Internet nicht viele Informationen zu diesem Aspekt gibt, also habe ich darüber nachgedacht, das Problem selbst zu lösen, damit ich bei Bedarf darauf zurückgreifen kann Ich brauche es in Zukunft oder Freunde, die es brauchen, können darauf verweisen. Der folgende Artikel führt Sie hauptsächlich in die Verwendung von Multi-Table-Assoziationen in YII2 ein. Freunde, die es brauchen, können einen Blick darauf werfen.
Vorwort
Dieser Artikel gibt eine kurze Einführung in die auf mehrere Tabellen bezogene Abfrage von YII2.0. Der Artikel stellt es im Detail anhand von Beispielcode vor. Ich werde im Folgenden nicht viel sagen. Werfen wir einen Blick auf die detaillierte Einführung:
Erklären wir zunächst die Tabellenstruktur
Tabellenstruktur
Jetzt gibt es Bestelltabelle, Benutzertabelle, Produktlistentabelle, Produktbestandstabelle
Wenn Sie in YII andere Tabellen für die Abfrage direkt verknüpfen möchten, müssen Sie zuerst deren Verknüpfung im Modell definieren
Bestellung
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 und hasOne verwenden
Zugehörige Verwendung
//获取订单信息 $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;
●Bei Aufruf als Funktion wird ein ActiveQuery-Objekt zurückgegeben ($customer->getOrders()->all())
●Bei Aufruf als Attribut wird das Ergebnis des Modells ($customer->orders) direkt zurückgegeben
Wenn dies der Fall ist, hat sich die Bestelltabelle geändert. Wir hoffen, dass Sie bei einer erneuten Abfrage
$user = $order->user;
Was ist, wenn Sie SQL erneut ausführen möchten? Sie können
//先释放缓存 unset($order->user); $order->user;
Kreuztabellenabfrage
Hier kommt der Schlüssel Punkt! Wie Sie dem Tabellenstrukturdiagramm oben entnehmen können, stehen die Tabelle „Benutzer“ und „Order_goods“ nicht in direktem Zusammenhang. Wenn wir also anhand der Benutzerinformationen herausfinden möchten, welche Produkte der Benutzer gekauft hat, müssen wir die beiden Tabellen über die Tabelle „Bestellung“ verknüpfen. Was also tun? Die erste ist die Modellebene. Da wir die Überprüfung anhand des Benutzers durchführen, gehen wir zur Ebene des Benutzermodells, um die Zuordnung zu definieren.
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'); }
Hinweis hier: getOrderGoods Die beiden order_id Verweisen Sie auf die order_id in der mit getOrder verknüpften Bestellung, und die erste order_id bezieht sich auf die order_id in OrderGoods. Aber! Wir haben auch die einfachste Methode, nämlich die Verwendung von SQL-Anweisungen!
$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();
Zusammenfassung
Das obige ist der detaillierte Inhalt vonDetaillierte Beispiele für den Betrieb von Multi-Table-Assoziationen in YII2. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!