ホームページ > PHPフレームワーク > ThinkPHP > ThinkPHPのクエリ相関機能の詳細説明

ThinkPHPのクエリ相関機能の詳細説明

PHPz
リリース: 2023-04-11 13:53:44
オリジナル
2031 人が閲覧しました

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 = [&#39;age&#39;];

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 サイトの他の関連記事を参照してください。

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