Heim > Backend-Entwicklung > PHP-Tutorial > Detaillierte Beispiele für den Betrieb von Multi-Table-Assoziationen in YII2

Detaillierte Beispiele für den Betrieb von Multi-Table-Assoziationen in YII2

黄舟
Freigeben: 2023-03-14 11:24:02
Original
1360 Leute haben es durchsucht

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']);
 }
}
Nach dem Login kopieren

1. HasMany und hasOne verwenden

Es gibt zwei Arten von Assoziationen zwischen Tabellen in Yii2. Sie werden verwendet, um die Assoziation zwischen zwei Modellen 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;
Nach dem Login kopieren
Natürlich können Sie die with-Methode verwenden, die einfacher aussieht. Der Parameter von with ist der Name der Beziehung, der user.

< in getUser im Modell definiert ist 🎜>


Der obige Code generiert und führt die folgende SQL-Anweisung aus
//返回订单信息(包括用户信息)
$order = Order::find(1)->with(&#39;user&#39;);
//或者
$order = Order::find(1)->getUser();
Nach dem Login kopieren


SELECT * FROM order WHERE id=1;
SELECT * FROM user  WHERE user.user_id=order.user_id;
Nach dem Login kopieren
Wie aus dem ersichtlich ist oben, Zugriff auf a Es gibt zwei Methoden für die Zuordnung

●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


Zugehöriger Ergebnis-Cache

Wenn dies der Fall ist, hat sich die Bestelltabelle geändert. Wir hoffen, dass Sie bei einer erneuten Abfrage


feststellen werden, dass es keine Änderung gibt die Bestellung noch einmal. 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.
$user = $order->user;
Nach dem Login kopieren

Was ist, wenn Sie SQL erneut ausführen möchten? Sie können


//先释放缓存
unset($order->user);
$order->user;
Nach dem Login kopieren

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.

Benutzer


public function getOrder() {
 return $this->hasMany(Order::className(), [&#39;user_id&#39; => &#39;user_id&#39;]);
}
 
public function getOrderGoods() {
 return $this->hasMany(OrderGoods::className(), [&#39;order_id&#39; => &#39;order_id&#39;])->
  via(&#39;order&#39;);
}
Nach dem Login kopieren

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!


Dies ist im Grunde der gesamte zugehörige Teil
$map = &#39;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&#39;;

$list1 = Article::findBySql($map)->asArray()->all();
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage