Kürzlich bin ich im Projekt auf Probleme im Zusammenhang mit der YII2-Mehrtabellenzuordnung gestoßen und habe keine geeigneten Informationen gefunden. Deshalb habe ich sie selbst sortiert, damit ich darauf zurückgreifen kann, wenn ich sie in Zukunft benötige oder Freunde, die sie benötigen es kann sich darauf beziehen. Dieser Artikel führt Sie hauptsächlich in die Verwendung von Multi-Table-Assoziationen in YII2 ein. Freunde, die es benötigen, können einen Blick darauf werfen. Ich hoffe, es hilft allen.
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
Reihenfolge
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
Es gibt zwei Arten von Zuordnungen zwischen Tabellen in Yii2: Wird verwendet, um die Beziehung zwischen zwei Modellassoziationen anzugeben.
●Eins-zu-viele: hasMany ●Eins-zu-eins: hasOne
●Rückgabeergebnisse: Die Rückgabeergebnisse dieser beiden Methoden sind yiidbActiveQuery-Objekte (falls gewünscht). Geben Sie die endgültige Standard-Array-Form zurück. Denken Sie daran, den Parameter asArray() hinzuzufügen)
●Der erste Parameter: der Klassenname des zugehörigen Modells.
●Der zweite Parameter: ist ein Array, wobei der Schlüssel das Attribut im zugehörigen Modell und der Wert das Attribut im aktuellen Modell ist.
Zugehörige Verwendung
Jetzt versuchen wir, eine Bestellung zu bekommen
//获取订单信息 $order = Order::findOne(1); //根据订单信息获取到用户信息 $user = $order->user;
Natürlich Sie können die with-Methode verwenden, die einfacher aussieht. Der Parameter von with ist der Name der Beziehung, die der Benutzer in getUser im Modell definiert wird die folgende SQL-Anweisung generieren und ausführen
//返回订单信息(包括用户信息) $order = Order::find(1)->with('user'); //或者 $order = Order::find(1)->getUser();
Wie aus dem Obigen ersichtlich ist, gibt es zwei Möglichkeiten, auf eine Beziehung zuzugreifen
SELECT * FROM order WHERE id=1; SELECT * FROM user WHERE user.user_id=order.user_id;
●Bei Aufruf als Funktion, Gibt ein ActiveQuery-Objekt zurück ($ Customer-& GT; GetOrders ()-& GT; ALL ()) ● Wenn Sie es in Attributen aufrufen, werden die Ergebnisse des Modells direkt zurückgegeben ($ Kunden-& gt; Bestellung)
Assoziationsergebnis-Cache
Wenn sich die Bestelltabelle zu diesem Zeitpunkt ändert und wir erneut abfragen möchten
Holen Sie sich die Bestellung erneut. Manchmal werden Sie feststellen, dass es keine Änderung gibt. Der Grund dafür ist, dass die Datenbank nur abgefragt wird, wenn $order->user zum ersten Mal ausgeführt wird, die Ergebnisse zwischengespeichert werden und SQL bei nachfolgenden Abfragen nicht ausgeführt wird. Was ist, wenn Sie SQL erneut ausführen möchten? Sie können$user = $order->user;
//先释放缓存 unset($order->user); $order->user;
Hier kommt der entscheidende 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.
Hinweis hier:
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'); }
Die zweite order_id in getOrderGoods bezieht sich auf die Bestellung, die mit getOrder The verknüpft ist order_id in , 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!
Dies ist im Grunde der gesamte Assoziationsteil$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();
Detaillierte Erläuterung der Batch-Einfügung des Yii-Frameworks von Daten Einfache Erweiterungsklasse
Detaillierte Erläuterung der restful API-Autorisierungsüberprüfung von yii2
Yii löst den Fehlerbericht zum Löschen der „DeleteAll“-Verbindungstabelle
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung der YII2-Mehrtabellenzuordnung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!