YII2マルチテーブル関連付けの使用方法の詳細な説明

*文
リリース: 2023-03-19 07:58:01
オリジナル
1739 人が閲覧しました

最近、プロジェクトでYII2マルチテーブル関連付けに関連する問題が発生し、適切な情報が見つからなかったので、将来必要になったときに参照できるように、または必要な友人が参照できるように自分で整理しましたそれを参照してください。この記事では主に YII2 でのマルチテーブル関連付けの使用方法を紹介します。必要な方は以下を参照してください。お役に立てれば幸いです。

はじめに

この記事では、YII2.0 のマルチテーブル関連のクエリについて簡単に紹介します。この記事では、コード例を通して詳しく紹介していますので、以下で詳しく説明します:

まず、テーブル構造を説明しましょう

今、次のものがあります。注文テーブル、ユーザーテーブル、商品リストテーブル、商品在庫テーブル

YII では、クエリ用に他のテーブルを直接関連付けたい場合は、最初にモデル内でそれらの関連付けを定義する必要があります

Order

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, hasOne use


Yii2 のテーブル間の関連付けには 2 種類あり、2 つのモデル間の関連付けを指定するために使用されます。 H ● 1 対 1: Hasmany ● 1 対 1: Hasone

● 戻り結果: これら 2 つのメソッドの戻り結果は yidbactiveQuery オブジェクトです (標準の配列形式に戻りたい場合は、忘れずに asarray を追加してください) () パラメータ)


●第一パラメータ:関連付けられたモデルのクラス名。


●2 番目のパラメータ: は配列で、キーは関連付けられたモデルの属性、値は現在のモデルの属性です。



関連付けの使用法

それでは、注文を取得してみましょう

//获取订单信息
$order = Order::findOne(1);
//根据订单信息获取到用户信息
$user = $order->user;
ログイン後にコピー

もちろん、より単純に見える with メソッドを使用することも選択できます。with のパラメータは関係の名前です。モデル内にある getUser のユーザーは内部で定義されています

//返回订单信息(包括用户信息)
$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;
ログイン後にコピー

上記から、関連付けにアクセスするには 2 つの方法があることがわかります

●関数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 フレームワークの単純な拡張クラスの詳細な説明

yii2 の RESTful API 認可検証の詳細な説明

Yii は DeleteAll テーブル削除エラーの問題を解決します

以上がYII2マルチテーブル関連付けの使用方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!