ホームページ >バックエンド開発 >PHPチュートリアル >YII2 で複数テーブルの関連付けを操作する方法の詳細な例
最近、仕事で 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']); } }
Yii2 のテーブル間の関連付けには 2 種類あり、2 つのモデル間の関連付けを指定するために使用されます。 H ● 1 対 1: Hasmany ● 1 対 1: Hasone
関連付けの使用法
それでは、注文を取得してみましょう
//获取订单信息 $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
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 サイトの他の関連記事を参照してください。