ホームページ > 記事 > PHPフレームワーク > ThinkPHP6 で ORM モデルの関連付け操作を実行するにはどうすればよいですか?
ThinkPHP6 は非常に人気のある PHP 開発フレームワークで、データベース操作を簡素化するための便利な ORM (オブジェクト リレーショナル マッピング) 操作メソッドを多数提供しており、最新バージョンではより豊富な ORM モデル関連付けメソッドが追加されているため、開発者は関連付けられたクエリをより簡単に実行できます。データベーステーブル間の操作。
この記事では、ThinkPHP6 で ORM モデルの関連付け操作 (1 対 1、1 対多、多対多の関連付け操作を含む) を実行する方法を紹介し、具体的な実装メカニズムについても説明します。関連付け操作の。
1 対 1 関連付け操作
1 対 1 関連付け操作とは、2 つのテーブル間に 1 対 1 の対応のみが存在する操作を指します。たとえば、ユーザー テーブル (users) とユーザー詳細テーブル (user_details) があります。各ユーザーはユーザー詳細レコードに対応します。ユーザー テーブルとユーザー詳細テーブルの間には 1 対 1 の関係があります。
まず、モデル クラスで 1 対 1 の関連付けを定義します。
namespace appmodel; use thinkModel; class User extends Model { // 定义一对一关联方法 public function detail() { return $this->hasOne('UserDetail'); } }
関連付けを定義するときは、hasOne メソッドを使用します。このメソッドは、現在のオブジェクトを表す BelongsTo オブジェクト インスタンスを返します。このクラスは、UserDetail モデル クラスを指す 1 対 1 の関係を「持っています」。
次に、UserDetail モデル クラスで逆関連付けメソッドを定義します。
namespace appmodel; use thinkModel; class UserDetail extends Model { // 定义反向关联方法 public function user() { return $this->belongsTo('User'); } }
UserDetail モデル クラスでは、belongsTo メソッドも使用します。このメソッドは、現在のオブジェクトを表す hasOne オブジェクト インスタンスを返します。モデル クラスが User モデル クラスに「属する」1 対 1 の関係。
これで、次のメソッドを通じて 1 対 1 の相関クエリを実行できるようになります:
// 查询用户信息,包括其详细信息 $user = User::with(['detail'])->find(1); // 查询用户信息,只包括其详细信息 $user = User::with(['detail' => function($query){ $query->field('user_id, address'); }])->find(1);
上の例では、with メソッドを使用して相関モデルを指定し、find メソッドを使用します。ユーザー情報を照会します。関連するクエリ結果は配列の形式で返され、必要に応じてフィールド フィルタリングを実行できます。
1 対多の関連付け操作
1 対多の関連付け操作とは、1 つのテーブル内のレコードが別のテーブル内の複数のレコードに対応できることを意味します。たとえば、コース スケジュール (コース) と学生テーブル (学生) があります。各コースには選択科目を受講する複数の学生が含まれます。コース スケジュールと学生テーブルの間には 1 対多の関係があります。
最初に、コース モデル クラスで 1 対多の関連関係を定義します。
namespace appmodel; use thinkModel; class Course extends Model { // 定义一对多关联方法 public function students() { return $this->hasMany('Student'); } }
関連関係を定義するときは、hasMany オブジェクト インスタンスを返す hasMany メソッドを使用します。現在のモデル クラスには、Student モデル クラスとの 1 対多の関連関係を示す「複数の」ポイントを表します。
次に、Student モデル クラスで逆関連付けメソッドを定義します。
namespace appmodel; use thinkModel; class Student extends Model { // 定义反向关联方法 public function course() { return $this->belongsTo('Course'); } }
Student モデル クラスでは、belongsTo メソッドも使用します。これは、現在の属性を示す hasOne オブジェクト インスタンスを返します。モデル クラスが Course モデル クラスに「属する」1 対多の関係。
これで、次のメソッドを通じて 1 対多の相関クエリを実行できるようになります:
// 查询课程信息,包括其选修学生信息 $course = Course::with(['students'])->find(1); // 查询课程信息,只包括其选修学生姓名和年龄信息 $course = Course::with(['students' => function($query){ $query->field('name, age'); }])->find(1);
上の例では、with メソッドを使用して相関モデルを指定し、find メソッドを使用します。コース情報を問い合わせます。関連するクエリ結果は配列の形式で返され、必要に応じてフィールド フィルタリングを実行できます。
多対多の関連付け操作
多対多の関連付け操作とは、2 つのテーブル間に多対多の関係がある操作を指します。たとえば、コース スケジュール (コース) と教師テーブル (教師) があります。各コースは複数の教師によって教えることができ、各教師は複数のコースを教えることもできます。コース スケジュールの間には多対多の関係があります。そして先生のテーブル。
最初に、Course モデル クラスで多対多の関連関係を定義します。
namespace appmodel; use thinkModel; class Course extends Model { // 定义多对多关联方法 public function teachers() { return $this->belongsToMany('Teacher', 'course_teacher'); } }
関連関係を定義するときは、BelongsToMany オブジェクト インスタンスを返すbelongsToMany メソッドを使用します。現在のモデル クラスの「多数に属する」は、Teacher モデル クラスの多対多の関連関係を指します。また、中間テーブルのテーブル名を表す 2 番目のパラメーター「course_Teacher」を渡す必要があります。
次に、Teacher モデル クラスで逆関連付けメソッドを定義します。
namespace appmodel; use thinkModel; class Teacher extends Model { // 定义反向关联方法 public function courses() { return $this->belongsToMany('Course', 'course_teacher'); } }
Teacher モデル クラスでは、belongsToMany オブジェクト インスタンスを返し、現在のオブジェクトを表すbelongsToMany メソッドも使用します。モデル クラスの「多くを含む」は、Course モデル クラスとの多対多の関係を示します。また、中間テーブルのテーブル名を表す 2 番目のパラメータ「course_Teacher」を渡す必要があります。
これで、次のメソッドを通じて多対多の相関クエリを実行できるようになります:
// 查询课程信息,包括其授课老师信息 $course = Course::with(['teachers'])->find(1); // 查询课程信息,只包括其授课老师姓名和职称信息 $course = Course::with(['teachers' => function($query){ $query->field('name, title'); }])->find(1);
上の例では、with メソッドを使用して相関モデルを指定し、find メソッドを使用します。コース情報を問い合わせます。関連するクエリ結果は配列の形式で返され、必要に応じてフィールド フィルタリングを実行できます。
これまで、ThinkPHP6 で 1 対 1、1 対多、多対多の関連付け操作を含む ORM モデルの関連付け操作を実行する方法を学習しました。 ORM モデルの関連付け操作では、データベース テーブル間の関連付けクエリを簡単に完了できるため、開発効率が大幅に向上し、データベース操作の正確性が保証されます。
以上がThinkPHP6 で ORM モデルの関連付け操作を実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。