Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung der Verwendung der YII2-Mehrtabellenzuordnung

Detaillierte Erläuterung der Verwendung der YII2-Mehrtabellenzuordnung

*文
*文Original
2018-01-03 14:37:571780Durchsuche

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;

tabellenübergreifende Abfrage ausführen
//先释放缓存
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.

Benutzer

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();
Verwandte Empfehlungen:

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!

Stellungnahme:
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