Thinkphp6模型关联


前言

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 定义一个模型只有一个关联数据。

猜你喜欢

转载自blog.csdn.net/qq_48082548/article/details/130520937