ThinkPHPのクエリ相関機能の使い方

WBOY
リリース: 2023-06-03 08:01:17
転載
1696 人が閲覧しました

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(&#39;UserInfo&#39;, &#39;user_id&#39;);
}
}
ログイン後にコピー

上記のコードを完了したら、find() メソッドを使用して、必要なユーザーとその年齢をクエリできます:

//User模型
<?php

class User extends Model{
protected $readonly = [&#39;age&#39;];

public function userinfo(){
return $this -> hasOne(&#39;UserInfo&#39;, &#39;user_id&#39;);
}

public function getAgeAttr($value, $data){
if(isset($data[&#39;userinfo&#39;])){
return $data[&#39;userinfo&#39;][&#39;age&#39;];
}
return &#39;&#39;;
}
}
ログイン後にコピー

注: 上記のコードでは、$ を使用します。属性と同様に、$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(&#39;Order&#39;, &#39;user_id&#39;);
}
}
ログイン後にコピー

上記の関連付けを定義した後、find() メソッドを使用して、ユーザーの注文と各注文に対応する製品をクエリできます。

//Order模型
<?php
class Order extends Model{
public function goods(){
return $this -> hasMany(&#39;OrderGoods&#39;, &#39;order_id&#39;);
}
}
ログイン後にコピー

最後のパラメータ ('orders.goods ' ) は、すべての注文および注文関連商品の情報を同時にクエリすることを意味します。

2. 関連付けのクエリ

2.1 関連付けクエリの使用

モデル層で定義された関連付け属性にアクセスできます。モデル層レベルでリレーションシップを定義せずに、関連クエリを実装します。たとえば、ユーザーとその注文情報をクエリしたいとします。

//查询user表中id为1的用户的订单信息和订单的商品信息

$user = User::get(1, &#39;orders.goods&#39;);
var_dump($user -> orders[0] -> goods);
ログイン後にコピー

2.2 遅延相関

クエリ時に相関関係を自動的にクエリしたくない場合モデル関係の場合、遅延相関を使用してこの要件を達成できます。例:

$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(&#39;orders&#39;)->get(1);
ログイン後にコピー

上記のコードでは、find() メソッドに true パラメータを追加しました。このパラメータは、ユーザー モデルのすべての関連付けを含めることを示します。

以上がThinkPHPのクエリ相関機能の使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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