ホームページ >バックエンド開発 >PHPチュートリアル >YII2 で複数テーブルの関連付けを操作する方法の詳細な例

YII2 で複数テーブルの関連付けを操作する方法の詳細な例

黄舟
黄舟オリジナル
2017-07-22 15:02:441348ブラウズ

最近、仕事で 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 の Just 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;

上記からわかるように、次の 2 つの方法がありますアソシエーションにアクセス
数 ● 関数で呼び出すと、ActiveQuery オブジェクトが返されます ($ Customer-& GT; GetOrders ()-& GT; All ()) ● 属性で呼び出すと、モデル ($ Customer ->orders)

関連結果キャッシュ

この時点で注文テーブルが変更され、再度クエリを実行したい場合


$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();
これは基本的に関連部分全体です

概要


以上がYII2 で複数テーブルの関連付けを操作する方法の詳細な例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。