Yii フレームワークでは、モデル リレーションシップは非常に重要な概念であり、複数のデータ テーブル間のデータの関連付けを実現するために使用されます。関連関係を定義すると、データのクエリ時に関連データを直接取得できるため、クエリの複雑さが大幅に軽減され、データ クエリの効率が向上します。この記事では、リレーションシップの定義方法、さまざまなタイプのリレーションシップ、リレーションシップを使用してデータをクエリする方法など、Yii フレームワークのモデル リレーションシップについて詳しく紹介します。
1. アソシエーション関係の定義
Yii フレームワークでは、モデルクラスでアソシエーション関係を定義することで、データテーブル間のデータの関連付けを実現できます。具体的には、1 つ以上のパブリック メソッドがモデル クラスで定義されており、これらのメソッドは、Yii フレームワークが提供する一連の関連付けメソッドを呼び出すことによって、データ テーブルと他のデータ テーブル間の関連付けを記述します。以下は簡単な例です:
class Order extends ActiveRecord { public function getCustomer() { return $this->hasOne(Customer::className(), ['id' => 'customer_id']); } }
上の例では、注文テーブル (Order) と顧客テーブル (Customer) の間の関連付けを記述するために関連付けメソッド getCustomer() を定義しました。具体的には、Yii フレームワークによって提供される hasOne メソッドを使用しました。これは、一方向の 1 対 1 の関係、つまり、注文に対して顧客が 1 人だけであることを表します。このうち、最初のパラメータは関連するモデルクラス名を指定し、2 番目のパラメータは関連する外部キーと主キーの対応関係を指定します。この例では、orders テーブルの customer_id フィールドは、customers テーブルの id フィールドに対応します。
2. さまざまなタイプの関連付け
hasOne メソッドに加えて、Yii フレームワークは、さまざまなデータ関連付けメソッドを実装するために、他のいくつかのタイプの関連付けも提供します。一般的に使用されるタイプは次のとおりです。
1 対多の関連付けとは、1 つのモデル クラスが複数のモデル クラスに関連付けられることを意味します。同じタイプのモデル クラス。関連メソッドでは、hasManyメソッドを使用して定義できます。
class Order extends ActiveRecord { public function getOrderItems() { return $this->hasMany(OrderItem::className(), ['order_id' => 'id']); } }
上記のコードでは、 hasMany メソッドを通じて実装される Order モデル クラス内の複数の OrderItem モデル クラス間の関連関係を指定します。このうち、最初のパラメータは関連するモデルクラス名を指定し、2 番目のパラメータは関連する外部キーと主キーの対応関係を指定します。この例では、orders テーブルの id フィールドは、order items テーブルの order_id フィールドに対応します。
このタイプの関連付けは、2 つのモデル クラス間に中間関連付けテーブルがあることを示します。各モデル クラスには、中間関連付けテーブルに関連付けられた複数のレコードがあります。関連メソッドでは、hasManyメソッドを使用して定義できます。
class Order extends ActiveRecord { public function getOrderItems() { return $this->hasMany(OrderItem::className(), ['order_id' => 'id']); } public function getProducts() { return $this->hasMany(Product::className(), ['id' => 'product_id']) ->via('orderItems'); } }
上記のコードでは、 hasMany メソッドを通じて実装される Order モデル クラス内の複数の Product モデル クラス間の関係を指定します。このうち、最初のパラメータは関連するモデルクラス名を指定し、2 番目のパラメータは関連する外部キーと主キーの対応関係を指定します。 via('orderItems') メソッドを呼び出すことで、注文テーブル (Order) と製品テーブル (Product) の間の関連付けを直接使用するのではなく、関連付けに中間関連付けテーブル OrderItem を使用する必要があることを指定します。
1 対 1 の関連付けは、2 つのモデル間に一方向の 1 対 1 の関連付けがあることを示します。クラス。アソシエーションメソッドでは、hasOneメソッドを使用して定義できます。
class Order extends ActiveRecord { public function getCustomer() { return $this->hasOne(Customer::className(), ['id' => 'customer_id']); } }
上記のコードでは、Order モデル クラスと Customer モデル クラスの間の関連付け関係を指定します。これは、hasOne メソッドを通じて実装されます。このうち、最初のパラメータは関連するモデルクラス名を指定し、2 番目のパラメータは関連する外部キーと主キーの対応関係を指定します。
多対多の関連付けは、2 つのモデル クラス間に双方向の多対多の関連付けがあることを示します。関連メソッドでは、hasManyメソッドを使用して定義できます。
class Order extends ActiveRecord { public function getProducts() { return $this->hasMany(Product::className(), ['id' => 'product_id']) ->viaTable('order_item', ['order_id' => 'id']); } }
上記のコードでは、 hasMany メソッドを通じて実装される Order モデル クラス内の複数の Product モデル クラス間の関係を指定します。このうち、最初のパラメータは関連するモデルクラス名を指定し、2 番目のパラメータは関連する外部キーと主キーの対応関係を指定します。 viaTable('order_item', ['order_id' => 'id']) メソッドを呼び出すことにより、中間関連付けテーブル order_item が関連付けで使用される必要があることを指定します。
3. 関連付け関係を使用したデータのクエリ
関連付け関係を定義すると、Yii フレームワークが提供する ActiveRecord メソッドを使用して、対応するデータ クエリを完了できます。以下は簡単な例です。
$order = Order::findOne(1); $customer = $order->customer;
上記のコードでは、最初に findOne メソッドを使用して ID 1 の注文レコードをクエリし、次に関連付けメソッドを通じて注文に対応する顧客情報を取得します。
関連付けられたメソッドに直接アクセスするだけでなく、with メソッドを使用して関連付けられたデータをプリロードすることもできるため、データベースに複数回クエリを実行する必要性が減ります。
$orders = Order::find()->with('customer')->all(); foreach ($orders as $order) { echo $order->customer->name; }
上記のコードでは、最初に find メソッドを使用してすべての注文レコードをクエリし、with('customer') メソッドを呼び出して注文に関連付けられた顧客情報をプリロードします。このようにして、後続の foreach ループで、注文の顧客情報にアクセスするたびに、データベースに再度クエリを実行することなく、メモリから直接情報を取得できます。
要約
この記事では、リレーションシップの定義方法、さまざまなタイプのリレーションシップ、リレーションシップを使用してデータをクエリする方法など、Yii フレームワークのモデルのリレーションシップを主に紹介します。モデルのリレーションシップを合理的に使用することで、データ クエリの効率が大幅に向上し、プログラム コードをより簡潔で読みやすくすることができます。
以上がYii フレームワークのモデル関係: データ関連付けの実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。