laravel model relationship

laravel支持多种模型之间的relation,对应着模型间的one2one, one2many,many2many,hasManyThrough,Polymorphic, many2many polymorphic关系。

心法

1.所有relation都由model class上的方法来定义;

2. relationship和model本身都是以query builder作为基类的,因此对relation的操作也可以使用类似query builder的方法,比如:可以支持级联;

3.Dynamic property of model:这是 model->relation方式引用的结果,这种方式直接返回relation model的value,不支持query builder的级联操作,这是和model->relation()方法调用的本质区别。

也就是说model->relation = model->relation()->get()

关系的种类:

one 2 one(一对一)

例子User hasOne Phone, Phone belongsTo User这种关系。要使得这种关系work,则需要以下前提:

1. User模型

base table: users,

字段预设: id

relation method: phone (){ return $this->hasOne(‘App\Phone‘) }

注意:按照laravel的命名规约,laravel会假设phones表中有一个user_id字段作为users表中的id外键,

我们可以通过在user()方法中传入另外的参数来覆盖这种规约,比如$this->hasOne(‘App\Phone‘,‘owner_id‘)

在这里owner_id就是phones表中外键引用users表的id的字段名称(默认为user_id);

2.Phone模型

base table: phones,

字段预设: user_id

relation method: user(){ return $this->belongsTo(‘App\User‘)}

在这里,laravel也会预设parent表(也就是users表)中有一个id字段为primary key,如果你的parent表并不是使用id作为主键,则在上面的hasOne调用中,可以使用第三个参数来指定这个主键,比如

user(){return $this->hasOne(‘App\User‘,‘owner_id‘,‘u_id‘}. 这里owner_id为phones表中对users表主键(u_id)的外键引用字段名称

One 2 Many(一对多)

例子: Post hasMany Comments, Comment belongsTo Post,这就是典型的一对多关系模型

1. Post模型

base table: posts

字段预设:id标示行主键

relation method: comments(){return $this->hasMany(‘App\Comment‘)}

如果需要覆盖默认命名规约,我们需要这样调用:

public function comments(){return $this->hasMany(‘App\Comment‘,‘foreign_owner_postid_key‘,‘local_postid_key‘)}

注意这里:foreign_owner_postid_key就是要在comments表中具有的字段名;

local_postid_key就是posts本表中必须具有的主键字段名

2. Comment模型

base table: comments

字段预设: post_id 作为posts表的外键

relation method: post(){return $this->belongsTo(‘App\Post‘)}

如果需要覆盖默认命名规约,同样我们需要这样调用:

public function post(){return $this->belongsTo(‘App\Post‘,‘foreign_owner_postid_key‘,‘other_local_postid_key‘}

注意:这里foreign_owner_postid_key就是在本comments表中必须具有的引用posts表的外键字段名;

other_local_postid_key就是必须在posts表中具有的主键名称。之所以加local,other就是代表的是本表的还是关联表的。

另外,上面也已经提到由于relationship本身就是query builder因此可以增加约束级联,比如:

Post::find(1)->comments()->where(‘title‘,‘foo‘)->first()就只取title为foo的第一条post对应的comment

other_local_postid_key就是

注意按照laravel默认命名规约,一对多的关系模型,child model中的owning model

时间: 2024-11-01 14:21:32

laravel model relationship的相关文章

Laravel Model 利用 Macroable 为数据模型添加宏能力

什么是ThinkSNS ?ThinkSNS(简称TS),一款全平台综合性社交系统,为国内外大中小企业和创业者提供社会化软件研发及技术解决方案. 产生需求在使用 Laravel 开发 ThinkSNS Plus 的时候,因为很多功能块都没有写在一个库里面,利用拓展包的形式添加实际功能,里面很多地方也用到了"多态多对多"的关系.问题来了,开发一个问答程序,想要给用户模型增加发布的问题或者回答的关系,起初是继承一份 User 模型,添加了关系,之后就发现问题了,因为用户的 tag 是使用多态

Laravel Model Factory(模型工厂)的用法以及数据本地化

Model Factory的位置 生成数据方法:make是生成数据,create是生成数据并保存到数据库 本地化方法 这样便生成了中文数据 整理自www.laravist.com视频教程

Laravel Model 的 fillable (白名单)与 guarded (黑名单)

例如 protected $fillable = ['name']; protected $guarded = ['price']; 定义了 name 字段可以写入/修改,而 price 字段不可以. 需要注意的是,fillable 与 guarded 只限制了 create 方法,而不会限制 save. 我觉得 Laravel 这样设计的原因是,create 通常是使用 request 中的所有请求参数来创建对象,而 save 则是一个字段一个字段的手动赋值,所以 create 有可能会恶意加

Laravel Model 事件使用注意事项

1 触发条件 1.1 updating 1.1.1 如果字段无变化,不会触发此事件. 1.1.2 除非更改至少一个字段的值 2 事件逻辑不会覆盖 2.1 Trait 中定义事件如下 /** * The boot method. */public static function bootHasArchive(){ static::creating(function ($model) { Log::info(__FILE__); }); static::updating(function ($mod

Laravel firstOrNew 与 firstOrCreate 的区别

例如: $item = App\Deployment::firstOrNew( ['name' => '问答小程序'], ['delayed' => 1] ); firstOrNew 需要手动调用 save,才会保存到数据库.适合同时需要修改其他属性的场景. firstOrCreate 会自动保存到数据库.适合不需要额外修改其他属性的场景. 注意:MassAssignmentException firstOrCreate 一定要设置 model 的 fillable, 否则会报 MassAss

Laravel5.1 模型初探

Laravel的模型也是访问数据库的,它更加面向对象,一个模型对应着一张表 我们可以使用模型对数据做一些增删改查的操作. 1 创建模型 创建模型是可以使用Artisan控制台的: php artisan make:model Article 一般我比较喜欢连带着migration一起生成: php artisan make:model Article -m ↑ 执行了上面的Artisan命令后 我们就可以在 /app 下找到我们刚刚创建的模型了,顺便也生成好了migration. 2 模型常用属

DBMS的优点和缺点

1.6  Advantages and Disadvantages of DBMSs (数据库的优点和缺点) The database management system has promising potential advantages. (数据库管理系统具有广阔的潜在优势.) promising /pr'?misi?/ adj. someone or something that is promising seems likely to be very good or successful

Lavavel笔记 Eloquent ORM分页源码分析

安装了laravel-debugbar后打开一个列表页面,发现页面输出有两个 select count(*) 语句,这是一个严重的设计缺陷呀. 查看代码 $users = User::where('votes', '>', 100)->paginate(15); $count = User::where('votes', '>', 100)->count(); 之前就感觉paginate分页应该是使用了count,但是不知道怎么取总量数据所以又写了一个count(). var_du

snorby 2.6.2 undefined method `run_daily_report' for Event:Class (NoMethodError)

rails runner "Event.run_daily_report"测试邮件配置undefined method `run_daily_report' for Event:Class (NoMethodError) 原因是:snorby2.6.1开始移除了DailyCacheJob,因此需要更换测试方式 新的测试方式:rails r ReportMailer.daily_report.deliver 源自:https://github.com/Snorby/snorby/issu