Laravel之Eloquent ORM关联
一.一对一 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');
} 原生sql
select * from `lar_users` where `lar_users`.`id` = ? limit 1
select * from `lar_tasks` where `lar_tasks`.`user_id` = ? and `lar_tasks`.`user_id` is not null 2.多从对一主
这跟一对一的从对主一样 三.对关联关系进行查询(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_users
select * from `lar_tasks` where `lar_tasks`.`user_id` = ? and `lar_tasks`.`user_id` is not null limit 1
select * from `lar_tasks` where `lar_tasks`.`user_id` = ? and `lar_tasks`.`user_id` is not null limit 1
select * from `lar_tasks` where `lar_tasks`.`user_id` = ? and `lar_tasks`.`user_id` is not null limit 1
select * 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_users
select * from `lar_tasks` where `lar_tasks`.`user_id` in (?, ?) 五.关联模型的insert/update
1.基本的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 1
insert 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();
Laravel之Eloquent ORM关联的更多相关文章
- laravel通过Eloquent ORM实现CURD
//Eloquent ORM public function orm1() { //all(); 返回所有数据: /*$students=Student::all(); dd($students);* ...
- Laravel之Eloquent ORM
一.ORM编程思想 1.1 Active Record 设计模式 Active Record 是一种数据访问设计模式,它可以帮助你实现数据对象Object到关系数据库的映射.应用Active Reco ...
- Laravel使用Eloquent ORM操作数据库
1.定义模型 <?php namespace App; use Illuminate\Database\Eloquent\Model; class Flight extends Model{ p ...
- Laravel之Eloquent ORM访问器调整器及属性转换
一.查询构建器的get方法 查询构建器的get方法返回了一个集合 $users = App\User::where('active', 1)->get(); foreach ($users as ...
- laravel 5.1 使用Eloquent ORM 操作实例
Laravel 的 Eloquent ORM 提供了更优雅的ActiveRecord 实现来和数据库的互动. 每个数据库表对应一个模型文件. 数据库配置 .env文件(也可以直接修改config/da ...
- Laravel Eloquent ORM
Eloquent ORM 简介 基本用法 集体赋值 插入.更新.删除 软删除 时间戳 查询范围 关系 查询关系 预先加载 插入相关模型 触发父模型时间戳 与数据透视表工作 集合 访问器和调整器 日期调 ...
- [转]Laravel 4之Eloquent ORM
Laravel 4之Eloquent ORM http://dingjiannan.com/2013/laravel-eloquent/ 定义Eloquent模型 模型通常放在app/models目录 ...
- Eloquent ORM 之关联查询
小伙伴们好,本文是在我的前一篇随笔的基础上完成的,还没有浏览的同学,请移尊驾哦 Eloquent ORM学习笔记. 前一篇文章用到了leftJoin方法,其实Eloquent对于模块之间的关联查询有自 ...
- Laravel 数据库操作 Eloquent ORM
laravel 操作数据库一般都使用它的Eloquent ORM才操作 建立模型 <?php namespace App; use Illuminate\Database\Eloquent\Mo ...
随机推荐
- Linux & Android 多点触摸协议
Linux & Android 多点触摸协议 Android4.0多点触摸入门 1 KERNEL 对于触摸屏的驱动我们简单的划分为两个主要的部分,一个是注册,另一个是上报. 1.1 注册 单点 ...
- 非常好!!!Linux源代码阅读——中断【转】
Linux源代码阅读——中断 转自:http://home.ustc.edu.cn/~boj/courses/linux_kernel/2_int.html 目录 为什么要有中断 中断的作用 中断的处 ...
- Centos 6.3防火墙端口放行
vi /etc/sysconfig/iptables #防火墙增加 -A INPUT -p tcp -m state --state NEW -m tcp --dport -j ACCEPT serv ...
- 关于js拖拽功能,拖拽元素的position:fixed;left:0;right:0;样式引起左右拖动元素会出现落后鼠标移动距离的问题
被拖拽元素的样式如果为:position:fixed;left:0;right:0;(当时是为了让fixed定位的元素水平居中加的left:0;right:0;避免js动态计算定位的麻烦)时左右拖动会 ...
- 【linux高级程序设计】(第十一章)System V进程间通信 1
System V, 曾经也被称为 AT&T System V,是Unix操作系统众多版本中的一支. 传统上,System V 被看作是两种UNIX"风味"之一(另一个是 B ...
- UVA 10129 Play on Words (欧拉通路)
本文链接:http://www.cnblogs.com/Ash-ly/p/5398627.html 题意: 输入N(N <= 100000)个单词,是否可以把所有这些单词排成一个序列,使得每个单 ...
- Python的Web编程[1] -> Web服务器[0] -> Web 服务器与 CGI / WSGI
Web服务器 / Web Server 对于Web来说,需要建立一个Web服务器,必须建立一个基本的服务器和一个处理程序, 基本服务器的主要作用是,在客户端和服务器端完成必要的HTTP交互, 处理程序 ...
- Python的程序结构[3] -> 变量/Variable[0] -> 变量类型
变量类型 / Variable Type 在 Python 中,变量主要有以下几种,即全局变量,局部变量和内建变量, 全局变量 / Global Variable 通常定义于模块内部,大写变量名形式存 ...
- 状压DP【p1896】[SCOI2005]互不侵犯
Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包 ...
- 固件分析工具Binwalk
固件分析工具Binwalk 固件是保存在嵌入式设备存储器的程序.它负责设备运行和功能,如路由器等设备.通过分析固件文件,可以了解设备的工作方式,并且确认是否存在漏洞.Binwalk是Kali Li ...