最近、プロジェクトでYII2マルチテーブル関連付けに関連する問題が発生し、適切な情報が見つからなかったので、将来必要になったときに参照できるように、または必要な友人が参照できるように自分で整理しましたそれを参照してください。この記事では主に YII2 でのマルチテーブル関連付けの使用方法を紹介します。必要な方は以下を参照してください。お役に立てれば幸いです。
はじめに
この記事では、YII2.0 のマルチテーブル関連のクエリについて簡単に紹介します。この記事では、コード例を通して詳しく紹介していますので、以下で詳しく説明します:
まず、テーブル構造を説明しましょう
今、次のものがあります。注文テーブル、ユーザーテーブル、商品リストテーブル、商品在庫テーブル
YII では、クエリ用に他のテーブルを直接関連付けたい場合は、最初にモデル内でそれらの関連付けを定義する必要があります
Orderclass 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']);
}
}
Yii2 のテーブル間の関連付けには 2 種類あり、2 つのモデル間の関連付けを指定するために使用されます。 H ● 1 対 1: Hasmany ● 1 対 1: Hasone
関連付けの使用法
それでは、注文を取得してみましょう
//获取订单信息 $order = Order::findOne(1); //根据订单信息获取到用户信息 $user = $order->user;
//返回订单信息(包括用户信息) $order = Order::find(1)->with('user'); //或者 $order = Order::find(1)->getUser();上記のコードは、次の SQL ステートメントを生成して実行します
SELECT * FROM order WHERE id=1; SELECT * FROM user WHERE user.user_id=order.user_id;
●関数Callの形式の場合は、ActiveQueryオブジェクトを返します($Customer-& GT; GetOrders()-& GT; All()) ● 属性で呼び出した場合は、モデルの結果が直接返されます( $ Customer-& gt; order)
関連付け結果のキャッシュ
この時点で注文テーブルが変更され、再度クエリを実行したい場合
$user = $order->user;
再度注文を取得すると、変化。その理由は、$order->user が初めて実行されるときにのみデータベースがクエリされ、その結果がキャッシュされ、後続のクエリでは SQL が実行されないためです。 では、SQL を再度実行したい場合はどうすればよいでしょうか?
//先释放缓存 unset($order->user); $order->user;
クロステーブルクエリ
を実行できます。 以下が重要なポイントです。上のテーブル構造図からわかるように、User テーブルと Order_goods は直接関連していないため、ユーザー情報に基づいてユーザーがどの製品を購入したかを知りたい場合は、Order テーブルを通じて 2 つのテーブルを関連付ける必要があります。じゃあ何をすればいいの? 1 つ目はモデル層です。ユーザーに基づいてチェックしているため、ユーザー モデル レイヤーに移動して関連付けを定義します。 User
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'); }
ここで注意してください: getOrderGoods の 2 番目の order_id は、getOrder に関連付けられた Order の order_id を指し、最初の order_id は OrderGoods の order_id を指します。
でも! 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();
これは基本的に関連付け部分全体です
データのバッチ挿入のための Yii フレームワークの単純な拡張クラスの詳細な説明
Yii は DeleteAll テーブル削除エラーの問題を解決します
以上がYII2マルチテーブル関連付けの使用方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。