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