前言
ThinkPHP 6 模型关联是指使用 PHP 对象关系映射(ORM)机制,通过模型类的关联属性,在两个或多个数据表之间建立关联关系。
以下是 ThinkPHP 6 中常用的模型关联方式:
提示:以下是本篇文章正文内容,下面案例可供参考
一、一对一关联
在一对一关联中,一个模型类对应于另一个模型类的唯一实例。例如一个用户只有一个详细信息,可以通过定义下面的关联方法来表示:
其中,User 模型类中的 profile() 方法返回一个 hasOne 实例,表示一个用户只有一个详细信息,而 Profile 模型类中的 user() 方法则返回一个 belongsTo 实例,表示一个详细信息属于一个用户。
use think\Model;
use app\common\model\User;
use app\common\model\Profile;
class User extends Model
{
public function profile()
{
return $this->hasOne(Profile::class);
}
}
class Profile extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
}
示例
<?php
namespace app\model;
use think\Model;
class UserModel extends Model
{
// 设置模型对应的数据表名
protected $table = 'user';
// 定义用户和个人资料之间的一对一关联
public function profile()
{
//user_id:外键id
return $this->hasOne(ProfileModel::class, 'user_id');
}
}
//查询
use app\model\UserModel;
// 查询所有用户以及其对应的个人资料信息
$users = UserModel::with('profile')->select();
反向查询
namespace app\model;
use think\Model;
class ProfileModel extends Model
{
// 设置模型对应的数据表名
protected $table = 'profile';
// 定义个人资料和用户之间的一对一反向关联
public function user()
{
//user_id:外键id
return $this->belongsTo(UserModel::class, 'user_id');
}
}
//查询
use app\model\ProfileModel;
// 查询所有个人资料以及对应的用户信息
$profiles = ProfileModel::with('user')->select();
二、一对多
在一对多关联中,一个模型类对应于另一个模型类的多个实例。例如一个班级有多个学生,可以通过定义下面的关联方法来表示:
其中,Clazz 模型类中的 students() 方法返回一个 hasMany 实例,表示一个班级有多个学生,而 Student 模型类中的 clazz() 方法则返回一个 belongsTo 实例,表示一个学生属于一个班级。
class Clazz extends Model
{
public function students()
{
return $this->hasMany(Student::class);
}
}
class Student extends Model
{
public function clazz()
{
return $this->belongsTo(Clazz::class);
}
}
三、多对多
在多对多关联中,多个模型类之间通过一个中间表建立关联关系。例如一个文章可以有多个标签,一个标签也可以对应多篇文章,可以通过定义下面的关联方法来表示:
其中,Article 模型类中的 tags() 方法返回一个 belongsToMany 实例,表示一篇文章可以有多个标签,而 Tag 模型类中的 articles() 方法则返回一个 belongsToMany 实例,表示一个标签可以对应多篇文章。
class Article extends Model
{
public function tags()
{
return $this->belongsToMany(Tag::class);
}
}
class Tag extends Model
{
public function articles()
{
return $this->belongsToMany(Article::class);
}
}
四、 示例
<?php
namespace app\model;
use think\Model;
class UserModel extends Model
{
// 设置模型对应的数据表名
protected $table = 'user';
// 定义用户和个人资料之间的一对一关联
public function profile()
{
//user_id:外键id
return $this->hasOne(ProfileModel::class, 'user_id');
}
}
//查询
use app\model\UserModel;
// 查询所有用户以及其对应的个人资料信息
$users = UserModel::with('profile')->select();
反向查询
namespace app\model;
use think\Model;
class ProfileModel extends Model
{
// 设置模型对应的数据表名
protected $table = 'profile';
// 定义个人资料和用户之间的一对一反向关联
public function user()
{
//user_id:外键id
return $this->belongsTo(UserModel::class, 'user_id');
}
}
//查询
use app\model\ProfileModel;
// 查询所有个人资料以及对应的用户信息
$profiles = ProfileModel::with('user')->select();
总结
hasMany
hasMany 方法用于定义一个「一对多」的关联关系,其参数形式为:
$this->hasMany($related, $foreignKey = null, $localKey = null),
related:表示要关联的模型类名;
foreignKey:表示关联模型中指向当前模型的外键名,默认值为当前模型的小写名称加上 _id;
localKey:表示当前模型中关联的字段,默认值为当前模型的主键 id。
使用 hasMany 方法可以在当前模型中定义多条与另一个模型的关联关系,即一个模型拥有多个与另一个模型的关联数据。
belongsTo
belongsTo 方法用于定义一个「多对一」关联关系,其参数形式为:
$this->belongsTo($related, $foreignKey = null, $ownerKey = null, $relation = null),
$related:表示要关联的模型类名;
$foreignKey:表示当前模型中用于关联的字段名,默认值为
关联模型的小写名称加上 _id;
$ownerKey:表示关联模型中用于匹配的字段名,默认值为关联模型的主键 id;
$relation:表示关联关系的方法名。
使用 belongsTo 方法可以在当前模型中定义多条归属于某个模型的关联数据,即一个模型只属于另一个模型的某个数据。这种关联关系通常需要在数据库中定义外键约束。
hasOne
hasOne 方法用于定义一个「一对一」关联关系,与 hasMany 不同的是,它指定的是一个模型拥有一个与另一个模型的关联数据,其参数形式为:
$this->hasOne($related, $foreignKey = null, $localKey = null)
$related:表示要关联的模型类名;
$foreignKey:表示关联模型中指向当前模型的外键名,默认值为当前模型的小写名称加上 _id;
$localKey:表示当前模型中关联的字段,默认值为当前模型的主键 id。
使用 hasOne 方法可以在当前模型中定义多条与另一个模型的关联关系,即一个模型只有一个与另一个模型的关联数据。
hasMany 定义一个模型有多个关联数据,belongsTo 定义一个模型只属于某个数据,而 hasOne 定义一个模型只有一个关联数据。