1. モデルの関連付け
1.1 1 対 1 の関連付け
1 対 1 の関連付けデータが 2 つの場合 各テーブルにはレコードが 1 つだけあり、この場合は hasOne() 関数と beginTo() 関数を使用して関連付けます。 2 つのデータ テーブルがあり、1 つはユーザー テーブル (user テーブル)、もう 1 つはユーザー情報テーブル (userinfo テーブル) と呼ばれ、それぞれの構造は次のようになります。フィールドごとに user_id が関連付けられます。次に、user テーブル内のユーザー情報と対応する年齢をクエリする必要があります。手順は次のとおりです:
User モデルに userinfo() メソッドを任意のメソッド名で定義します。
user: id name userinfo: id user_id age
User モデルで age() メソッドを定義します。このメソッドは実際に、userinfo モデルの age フィールドにアクセスする属性を定義します。
//User模型 <?php class User extends Model{ public function userinfo(){ return $this -> hasOne('UserInfo', 'user_id'); } }
上記のコードを完了したら、find() メソッドを使用して、必要なユーザーとその年齢をクエリできます:
//User模型 <?php class User extends Model{ protected $readonly = ['age']; public function userinfo(){ return $this -> hasOne('UserInfo', 'user_id'); } public function getAgeAttr($value, $data){ if(isset($data['userinfo'])){ return $data['userinfo']['age']; } return ''; } }
注: 上記のコードでは、$ を使用します。属性と同様に、$readonly 属性は ThinkPHP によって提供される属性で、一部の属性がデータベースに書き込まれるのを保護できます。上記のコードでは、age 属性を読み取り専用属性として設定しているため、$user -> age にアクセスすると、getAgeAttr メソッドが自動的に呼び出され、userinfo モデルの age フィールドがクエリされます。
1.2 1 対多の関連付け1 対多の関連付けとは、2 つのデータ テーブルの一方には複数のレコードがあり、もう一方には 1 つのレコードしかないことを意味します。 。次の例のように:
//查询user表中id为1的用户 $user = User::get(1); echo $user -> name; echo $user -> age;
上の 2 つのテーブルは、order_id フィールドを通じて関連付けられています。次に、ユーザー テーブルでユーザーの注文情報と対応する製品情報を見つける必要があります。具体的な操作は次のとおりです:
User モデルでorders() メソッドを定義します。このメソッドは、ユーザーが複数の製品を持っていることを示します。命令。
order: id user_id order_no order_goods: id order_id name price
注文モデルで Goods() メソッドを定義します。このメソッドは、注文に複数の製品があることを示します。
//User模型 <?php class User extends Model{ public function orders(){ return $this -> hasMany('Order', 'user_id'); } }
上記の関連付けを定義した後、find() メソッドを使用して、ユーザーの注文と各注文に対応する製品をクエリできます。
//Order模型 <?php class Order extends Model{ public function goods(){ return $this -> hasMany('OrderGoods', 'order_id'); } }
最後のパラメータ ('orders.goods ' ) は、すべての注文および注文関連商品の情報を同時にクエリすることを意味します。
2. 関連付けのクエリ2.1 関連付けクエリの使用
モデル層で定義された関連付け属性にアクセスできます。モデル層レベルでリレーションシップを定義せずに、関連クエリを実装します。たとえば、ユーザーとその注文情報をクエリしたいとします。
//查询user表中id为1的用户的订单信息和订单的商品信息 $user = User::get(1, 'orders.goods'); var_dump($user -> orders[0] -> goods);
クエリ時に相関関係を自動的にクエリしたくない場合モデル関係の場合、遅延相関を使用してこの要件を達成できます。例:
$user = User::get(1); $orders = $user -> orders; echo $user -> name; foreach($orders as $order){ echo $order -> order_no . "\n"; }
上記のコードでは、$user 変数を設定するときに、with() 関数で取得する関連付けを定義しました。このとき、クエリ ステートメントは自動的に関連付けをクエリしません。デフォルトでは、待機します。クエリは、関連付け関係を使用する場合にのみ実行されます。
2.3 関連付けの包含上記の遅延関連付けに加えて、クエリのニーズを達成するために with メソッドの後に true パラメータを設定することで、すべての関連付けを自動的に含めることもできます。 。例:
$user = User::with('orders')->get(1);
上記のコードでは、find() メソッドに true パラメータを追加しました。このパラメータは、ユーザー モデルのすべての関連付けを含めることを示します。
以上がThinkPHPのクエリ相関機能の使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。