• 10 关联模型《ThinkPHP6 入门到电商实战》


    一、什么是关联模型

    关联模型指在 tp 中使用模型对多个数据表进行关联。例如一个主账户表与一个账户信息表进行关联,此时两者关联后可以更加简便的进行操作,使代码更加清晰,操作更加简便。

    二、 正向一对一关联

    一对一关联指的是数据只有一条而非多条。

    首先我们有一个 user 表如下:
    在这里插入图片描述
    接着给 student 表添加对应的 uid 列:
    在这里插入图片描述
    随后我们在model 文件夹下创建一个 User 的php 文件用于模型:
    在这里插入图片描述
    在 User 模型表中编写代码:

    
    namespace app\model;
    use think\Model;
    
    class UserModel extends Model
    {
        protected $name = 'user';
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    接着咱们在 User 模型中编写对应的关联代码(想要关联多张表在创建一个对应表名的方法和表模型即可):

    
    namespace app\model;
    use think\Model;
    
    class UserModel extends Model
    {
        protected $name = 'user';
        public function student(){
            return $this->hasOne(StudentModel::class,'uid');
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在 student 方法中,hasOne 表示一对一关联,其中第一个参数 StudentModel::class 表示关联的表,而第二个参数表示其表中所关联的外键为 uid。

    接着我们直接使用模型进行查询,看看是否成功关联。我们在 index 类中更改 usemodel 方法:

    public function useModel(){
        $user = UserModel::find(7); 
        return json($user->student->name); 
    }
    
    • 1
    • 2
    • 3
    • 4

    其中 UserModel 直接find 主键id 为 7 的数据,接着直接使用 json 返回 user 表下所关联的 student 表中的 name字段,查看是否成功获取,最后访问该方法的结果如下,成功获取到了数据:
    在这里插入图片描述

    三、 反向一对一关联

    有了正向关联后反向关联咱们可以不用进行编写,但是你想编写也行,咱们在 student 模型类中编写代码如下:

    
    namespace app\model;
    use think\Model;
    
    class StudentModel extends Model
    {
        protected $name = 'student';
        public function user() { 
            return $this->belongsTo(UserModel::class); 
        } 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    四、一对多关联

    一对多关联指主表关联的数据在副表中有多条对应,例如此时我在副表中右如下数据:
    在这里插入图片描述
    此时 uid 的值是有两条重复的,那么我们此时修改对应的 user 模型中的方法:

    public function student(){
        //return $this->hasOne(StudentModel::class,'uid');
        return $this->hasMany(StudentModel::class,'uid');
    }
    
    • 1
    • 2
    • 3
    • 4

    修改 hasOne 成 hasMany 即可,此时修改对应的useModel 方法如下:

    public function useModel(){
        $user = UserModel::find(['uid'=>20]); 
        return json($user->student); 
    }
    
    • 1
    • 2
    • 3
    • 4

    结果如下:
    在这里插入图片描述

    此时还可以进行链式操作,查询身高大于 168 的数据:

    public function useModel(){
        $user = UserModel::find(['uid'=>20]); 
        return json($user->student()->where('height','>',168)->select()); 
    }
    
    • 1
    • 2
    • 3
    • 4

    结果如下:
    在这里插入图片描述

    五、关联模型的数据新增

    使用关联模型进行数据新增,可直接使外键进行增加,只要考虑数据的新增即可,以下是代码示例:

    public function useModel(){
         $user = UserModel::find(7); 
         $res=$user->student()->saveAll([ 
                 ['name'=>'关联数据1', 'height'=>0], 
                 ['name'=>'关联数据2', 'height'=>0] 
             ]);
         dump($res);
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    此时我们首先是使用了 find,随后直接给与 student 数据新增,新增时不需要传入对应的 uid 数据,因为之前在模型中已经进行了设置外键,那么访问后数据库成功新增数据:
    在这里插入图片描述
    此时成功操作后所返回的内容是对应的模型数组:
    在这里插入图片描述

    六、关联删除

    关联删除可使删除主表数据时同时删除副表数据,以下为示例:

    public function useModel(){
       $user = UserModel::with('student')->find(7); 
       $res=$user->together(['student'])->delete();
       dump($res);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里要注意,需要使用 with 方法,随后使用 together 传入一个副表数组,可以传入多个副表进行删除,返回值为布尔值:
    在这里插入图片描述

  • 相关阅读:
    毕设 问卷调查系统
    使用trigger-forward跨流水线传递参数
    智能蓝牙血压计方案设计与开发
    微泡排气除污装置有哪几种叫法吗?
    [附源码]计算机毕业设计springboot基于Web的软考题库平台
    如何入门网络安全有什么条件呢?持有NISP或CISP证书可敲门
    使用uni-app创建扫码连接wifi小程序
    csp 202109-2 非零段划分
    RabbitMq:RabbitMq消息中的相关处理 ③
    SPI:Java的高可扩展利器
  • 原文地址:https://blog.csdn.net/A757291228/article/details/126204200