ホームページ > バックエンド開発 > PHPチュートリアル > Yii2.0 テーブル関連付けクエリの分析

Yii2.0 テーブル関連付けクエリの分析

不言
リリース: 2023-04-01 10:34:02
オリジナル
2633 人が閲覧しました

この記事では、主に Yii2.0 テーブル関連付けクエリの方法を紹介し、Yii での関連付けクエリの実装方法と関連する使用スキルを分析します。必要な方は、次の例を参照してください。

この記事の例は Yii2.0 のテーブル関連付けクエリ方法を紹介しています。参考のために皆さんと共有してください。詳細は次のとおりです。

ActiveRecord を使用して、関連するクエリ (たとえば、テーブル A からデータを読み取るときに、テーブル B の関連データを一緒に読み取る) を実行できます。 Active Record では、メイン テーブル内の ActiveRecord オブジェクトのプロパティにアクセスするだけで、関連データを取得できます。

たとえば、適切な関係宣言を使用すると、$customer->orders を使用して、この顧客が行った注文を表す Order オブジェクトの配列を取得できます。

関係を宣言するには、関連するコンテキスト情報を含む yii\db\ActiveQuery オブジェクトを返すゲッター メソッドを定義します。これにより、条件を満たす関連データのみがクエリされるようになります。例:

class Customer extends \yii\db\ActiveRecord
{
 public function getOrders()
 {
  // Customer has_many Order via Order.customer_id -> id
  return $this->hasMany(Order::className(), ['customer_id' => 'id']);
 }
}
class Order extends \yii\db\ActiveRecord
{
 // Order has_one Customer via Customer.id -> customer_id
 public function getCustomer()
 {
  return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
 }
}
ログイン後にコピー

上記のコードの yii\db\ActiveRecord::hasMany() と yii\db\ActiveRecord::hasOne() は、1 対多と 1 対をモデル化するために使用されます。リレーショナル データベース内の 1 つ 関連する関係。たとえば、顧客に複数の注文があり、1 つの注文が 1 人のユーザーを所有または所有しているとします。どちらのメソッドも 2 つのパラメータを受け取り、yii\db\ActiveQuery オブジェクトを返します。

$class: 関連付けられたモデルのクラス名。

$link: 2 つのテーブル間の列の関連付け。これは配列でなければなりません。配列要素のキーは$classに対応するテーブルの列名、配列要素の値は現在宣言されているクラスの列名です。テーブルの外部キーの関連付けに関してこれらの関係を定義することは、プログラミングの優れた実践方法です。

上記の宣言を完了すると、対応する getter メソッドを定義することで、オブジェクトのプロパティにアクセスするのと同じように、関連するデータを取得できます。

// get the orders of a customer
$customer = Customer::findOne(1);
$orders = $customer->orders; // $orders is an array of Order objects
ログイン後にコピー

上記のコードは、実際にバックグラウンドで次の 2 つの SQL クエリを実行します。それぞれ、上記の 2 行のコードに対応します。

SELECT * FROM customer WHERE id=1;
SELECT * FROM order WHERE customer_id=1;
ログイン後にコピー

ヒント: $customer->orders に再度アクセスしても、上の 2 行目の SQL クエリは繰り返し実行されません。このクエリ ステートメントは、式が初めてアクセスされたときにのみ実行されます。後続のアクセスでは、内部バッファリングされたデータが直接返されます。クエリを再実行する場合は、最初に unset を呼び出してキャッシュをクリアします。

unset($customer->orders);.
ログイン後にコピー

クエリ条件を制限するために、関連するクエリにパラメータを渡したい場合があります。たとえば、すべての注文ではなく、指定した金額を超える大量の注文のみを読み取りたいとします。この目的のために、次の getter メソッドを使用して bigOrders 関係を宣言できます:

class Customer extends \yii\db\ActiveRecord
{
 public function getBigOrders($threshold = 100)
 {
  return $this->hasMany(Order::className(), ['customer_id' => 'id'])
   ->where('subtotal > :threshold', [':threshold' => $threshold])
   ->orderBy('id');
 }
}
ログイン後にコピー

Remember hasMany() の返されたオブジェクトは yii\db\ActiveQuery であるため、すべての ActiveQuery メソッドこの関連クエリをカスタマイズするために使用できます。

上記のステートメントでは、$customer->bigOrders にアクセスすると、金額が 100 を超える注文のみが返されます。別の制限値を指定する場合は、次のコードを使用します。

$orders = $customer->getBigOrders(200)->all();
ログイン後にコピー

注: 関連付けられたメソッドは、yii\db\ActiveQuery インスタンスを返します。プロパティ (クラス プロパティ) としてアクセスした場合、返されるデータは yii\db\ActiveRecord インスタンス、ActiveRecord 配列、または空 (null) です。たとえば、$customer->getOrders() は ActiveQuery インスタンスを返しますが、$customer->orders は Order オブジェクトの配列 (クエリ結果が空の場合は空の配列) を返します。

中間テーブル関連付けクエリ

一部のデータ テーブルは、中間テーブル (ピボット テーブル) を介して関連付けられることがあります。このような関係を宣言するには、via() または viaTable() メソッドを呼び出して yii\db\ActiveQuery オブジェクトをカスタマイズできます。

たとえば、order テーブルの order と product テーブルの item が接続テーブル order_item を通じて関連付けられている場合、次のように Order クラスで items の関係を宣言できます。

class Order extends \yii\db\ActiveRecord
{
 public function getItems()
 {
  return $this->hasMany(Item::className(), ['id' => 'item_id'])
   ->viaTable('order_item', ['order_id' => 'id']);
 }
}
ログイン後にコピー

The via( ) メソッドは viaTable() に似ていますが、最初のパラメータは中間テーブルの名前ではなく、現在の ActiveRecord クラスで宣言された関係名です。たとえば、上記の項目の関係は次のメソッドでも宣言できます。

class Order extends \yii\db\ActiveRecord
{
 public function getOrderItems()
 {
  return $this->hasMany(OrderItem::className(), ['order_id' => 'id']);
 }
 public function getItems()
 {
  return $this->hasMany(Item::className(), ['id' => 'item_id'])
   ->via('orderItems');
 }
}
ログイン後にコピー

上記がこの記事の全内容です。これが皆様の学習に役立つことを願っています。 PHP 中国語 Web サイトに注意してください。

関連する推奨事項:

Yii でのフォームの使用例

YII 関連のクエリの分析について

以上がYii2.0 テーブル関連付けクエリの分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート