美文网首页
Lumen 数据库操作orm之表关联hasOne(hasMany

Lumen 数据库操作orm之表关联hasOne(hasMany

作者: cxscode | 来源:发表于2019-07-26 16:57 被阅读0次

上次好像忘了写模型关联的方法,这里补充一下

hasOne

user表的id关联order表的user_id,一对一

class User{
  public function order()
    {
        return $this->hasOne(Order::class, 'user_id', 'id');
    }
}

order表的user_id关联user表的id,一对一,$class 可以作为参数,当user子类model关联order子类model的时候,可以灵活重写

    public function order($class = Order::class)
    {
        return $this->hasOne($class, 'user_id', 'id');
    }

当你需要关联最后一条记录时

    public function order($class = Order::class)
    {
        return $this->hasOne($class, 'user_id', 'id')->orderBy('id', 'desc');
    }

where之类的条件拼接也是可行的

    public function order($class = Order::class)
    {
        return $this->hasOne($class, 'user_id', 'id')->where('status', Order::STATUS_CREATE);
    }

belongsTo

order表的user_id关联user表的id,一对一

class User{
    public function user($class = User::class)
    {
        return $this->belongsTo($class, 'user_id', 'id');
    }
}

这里有人可能会问,这belongsTo和hasOne有啥区别

hasOne(hasMany)使用在:外键在子关联对象中,如业务上user表在order表之上,在User模型使用hasOne关联order,如下

class User{
    public function order($class = Order::class)
    {
        return $this->hasOne($class, 'user_id', 'id');
    }  
}

belongsTo(belongsToMany)使用在:外键在父联对象中,如业务上order表在user表之下,在Order模型使用belongsTo关联user,如下

class Order{
    public function user($class = User::class)
    {
        return $this->belongsTo($class, 'user_id', 'id');
    }  
}

hasMany

user表的id关联order表的user_id,一对多

class User{
    public function orders($class = Order::class)
    {
        return $this->hasMany($class, 'user_id', 'id');
    }
}

belongsToMany

管理员表admin,角色表role,中间表为admin_has_roles,admin表可以通过中间表查出对应的角色集合

class Admin{
    public function roles()
    {
        return $this->belongsToMany(
            \Common\Models\Rbac\Role::class,
            'admin_has_roles',
            'admin_id',
            'role_id'
        );
    }
}

我们可以看出,这里的使用也印证了hasMany与belongsToMany的区别,belongsToMany是向上查询的,必有一张admin_has_roles的中间表进行关联

这样描述可能有点抽象,我们可以假设上面的user和order的例子,
当一个order指向多个user时(比如多人拼单,只是假设),我们不可能在user表加order_id,所以下级业务表order在关联上级业务表user时,必会有order_has_users之类的中间表,也会用到belongsToMany关联,而不是hasMany了(暂时没有更通俗的表述,有好的建议可以评论补充一下)

纯手写,转载请注明出处哈~~~

相关文章

网友评论

      本文标题:Lumen 数据库操作orm之表关联hasOne(hasMany

      本文链接:https://www.haomeiwen.com/subject/hbedrctx.html