laravel笔记-Eloquent ORM(关联关系)

laravel笔记-Eloquent ORM(关联关系)

写在前面

时间可贵,善用目录↑

学习Laravel的笔记,仅仅是作为laravel文档笔记,目的是强化对文档的理解,质量不高。


什么是关联关系

这么说,一个数据库中表和表之间必然会存在一些联系,关联关系就是这个意思。

通过Eloquent我们可以方便的处理这些关系。


定义关联关系

一对一

比如说一个用户(User)会有一个手机(Phone),这种一对一的关系我们直接在User中定义一个phone方法就是可以了。

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model{
   
    /**
     * 获取关联到用户的手机
     */
    public function phone()
    {
   
        return $this->hasOne('App\Phone');
        //在这个例子中Phone模型默认有一个user_id外键,
        //如果你希望重写这种约定,可以传递第二个参数到hasOne方法。
        return $this->hasOne('App\Phone', 'foreign_key');
        /*Eloquent 假设外键应该在父级上有一个与之匹配的id,换句话说,Eloquent 将会通过user表的id值去phone表中查询user_id与之匹配的Phone记录。如果你想要关联关系使用其他值而不是id,可以传递第三个参数到hasOne来指定自定义的主键:*/
        return $this->hasOne('App\Phone', 'foreign_key', 'local_key');
        //说白了就是hasOne('关联Eloquent', '被关联表的key', '本表key')
    }
}

使用时:

//这样就可以获得phone的实例了
$phone = User::find(1)->phone;

相对的关联

一对一关联完了,我们就会想,user现在可以找到phone,那么我们怎么通过phone找到user。
方法类似上面:

namespace App;

use Illuminate\Database\Eloquent\Model;

class Phone extends Model{
   
    /**
     * 获取手机对应的用户
     */
    public function user()
    {
   
        /*,Eloquent 将会尝试通过Phone模型的user_id去User模型查找与之匹配的记录。Eloquent 通过关联关系方法名并在方法名后加_id后缀来生成默认的外键名。*/
        return $this->belongsTo('App\User');
        //参数类似上面的一对一
    }
}

一对多

比如说一片博客会有多条评论。hasMany
通过文章访问评论。

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model{
   
    /**
     * 获取博客文章的评论
     */
    public function comments()
    {
   
        //类似hasOne存在如下参数
        return $this->hasMany('App\Comment', 'foreign_key', 'local_key');
    }
}

一对多(逆向)

通过评论访问文章。belongsTo

namespace App;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model{
   
    /**
     * 获取评论对应的博客文章
     */
    public function post()
    {
   
        return $this->belongsTo('App\Post', 'foreign_key', 'other_key');
    }
}

多对多

一个用户有多个角色,同时一个角色被多个用户共用。例如,很多用户可能都有一个“Admin”角色。要定义这样的关联关系,需要三个数据表:users、roles和role_user,role_us
er表按照关联模型名的字母顺序命名,并且包含user_id和role_id两个列。

belongsToMany

就是两个表的数据是多对多的关系。
a表的一个数据在b表可以查到多条数据,b表的数据也可以在a表查到多条数据。
当然两个表的关系是通过一个中间表来组织起来的。
中间表的默认命名方式为:a_b,可以修改
多对多的逆向关联和正向是一样的。

用上面的例子:

对于User

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model{
   
    /**
     * 用户角色
     */
    public 
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值