博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Laravel之Eloquent ORM关联
阅读量:6906 次
发布时间:2019-06-27

本文共 3425 字,大约阅读时间需要 11 分钟。

一.一对一1.主对从(hasOne)从User模型中取出用户的手机User模型中:/*** 获取关联到用户的手机*/public function phone(){	return $this->hasOne('App\Phone');	// return $this->hasOne(Phone::class);}phone默认有个user_id外键关联user模型的id,所以上面的应该是return $this->hasOne('App\Phone', 'id', 'user_id');//第二个参数是被关联模型的(User模型中的)字段,第三个参数是当前模型的需要和被关联模型对应的字段(此处Phone模型字段)调用:User::find(1)->phone; //作为属性调用User::find(1)->phone()->get();//作为方法调用或者:$user = User::find(1);$phone = $task->phone()->get();如果对phone的结果进一步过滤,可以加where$phone = $task->phone()->where('is_active', 1)->get();对应原生的SQL查询:select * from `lar_users` where `lar_users`.`id` = 1 limit 1;select * from `lar_phones` where `lar_phones`.`id` = 1 and `lar_phones`.`id` is not null limit 1;2.从对主(belongsTo)/*** 获取任务模型对应的用户*/public function user(){        return $this->belongsTo(User::class, 'user_id', 'id');//和前面的相反,第二个参数是当前模型的字段,第三个参数是关联模型的字段}对应原生SQL:select * from `lar_tasks` where `lar_tasks`.`id` = 1 limit 1;select * from `lar_users` where `lar_users`.`id` = 1 limit 1;两者原生的SQL语句有个区别是加了is not null;二.一对多1.一主对多从public function tasks(){	return $this->hasMany(Task::class, 'user_id', 'id');}原生sqlselect * from `lar_users` where `lar_users`.`id` = ? limit 1select * from `lar_tasks` where `lar_tasks`.`user_id` = ? and `lar_tasks`.`user_id` is not null2.多从对一主这跟一对一的从对主一样三.对关联关系进行查询(where子查询)比如需要查询有三条任务的用户,使用has,传入关联属性User::has('tasks', '>', 3)->get()对应的原生SQL语句:select * from `lar_users` where (select count(*) from `lar_tasks` where `lar_tasks`.`user_id` = `lar_users`.`id`) > 3;更复杂的可以使用whereHas和orWhereHas,查询有任务,且任务名称为'发送'开头的用户User::whereHas('tasks', function($query) {	$query->where('name', 'like', '发送%');	})->get();对应的原生SQL语句:select * from `lar_users` where (select count(*) from `lar_tasks` where `lar_tasks`.`user_id` = `lar_users`.`id` and `name` like ?) >= 1;四.渴求式加载关联关系数据时"懒惰式加载"的,也就是在第一次用到的时候才会被加载.1.懒惰加载产生的问题打印每个用户的任务名称$users = User::all();foreach ($users as $user) {	$user->tasks->name;}这将先查询一次users表,再挨个去查询tasks表,有多少个用户就查询多少次原生的SQL语句如下所示:select * from `lar_usersselect * from `lar_tasks` where `lar_tasks`.`user_id` = ? and `lar_tasks`.`user_id` is not null limit 1select * from `lar_tasks` where `lar_tasks`.`user_id` = ? and `lar_tasks`.`user_id` is not null limit 1select * from `lar_tasks` where `lar_tasks`.`user_id` = ? and `lar_tasks`.`user_id` is not null limit 1select * from `lar_tasks` where `lar_tasks`.`user_id` = ? and `lar_tasks`.`user_id` is not null limit 1.............2.使用渴求式加载:$users = User::with('tasks')->get();foreach ($users as $user) {	$user->tasks->name;}原生的SQL语句如下所示:select * from `lar_usersselect * from `lar_tasks` where `lar_tasks`.`user_id` in (?, ?) 五.关联模型的insert/update1.基本的insert$user = User::find(1);$user->tasks()->create(['name' => '测试任务1']);也可以使用save/saveMany,不过save接受的是一个模型实例,create接受原生数组.user_id被自动带入到插入的数组中.原生SQL语句:select * from `lar_users` where `lar_users`.`id` = ? limit 1insert into `lar_tasks` (`name`, `user_id`, `updated_at`, `created_at`) values (?, ?, ?, ?);2.常见的从对主的更新(belongsTo)触发父模型的更新时间戳(update_at)class Task extends Model{    protected $touches = ['user'];    protected $fillable = ['name','user_id'];    public function user()    {        return $this->belongsTo(User::class, 'user_id', 'id');    }}更新:$task = Task::find(1);$task->name='最新测试';$task->save();

 

如果仅仅需要关联表的部分字段,则可以使用闭包,但字段中必须包含该关联表的主键,如

$users = User::with(['tasks'=>function($query){
  return $query->select('id', 'task_name');
}])->get();

 

转载于:https://www.cnblogs.com/itfenqing/p/6930432.html

你可能感兴趣的文章
smarty课程---smarty3的安装和使用
查看>>
m_Orchestrate learning system---mo系统权限思考(如何实现以及注意什么)
查看>>
Dcloud课程8 开心一刻应用如何实现
查看>>
html5--2.9新的布局元素(5)-hgroup/address
查看>>
jar包和war包的介绍和区别
查看>>
jQuery.获取过滤点
查看>>
64位Windows系统下32位应用程序连接MySql
查看>>
js 类似发微博或者微信朋友圈的时间显示 刚刚 几天前
查看>>
Oracle10gr2 开机自启动脚本
查看>>
netty websocket
查看>>
SpringMVC单文件上传、多文件上传、文件列表显示、文件下载
查看>>
sql server T-SQL 基础
查看>>
private static
查看>>
Java面试不得不知的程序(二)
查看>>
检测数据类型的几种方式
查看>>
Core Dump解析(1)
查看>>
PAT顶级 1002. Business (35)
查看>>
【jenkins】jenkins 持续集成本地项目(win)
查看>>
springmvc处理json
查看>>
【递推】【DFS】【枚举】Gym - 101246C - Explode 'Em All
查看>>