一.一对一

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关联的更多相关文章

  1. laravel通过Eloquent ORM实现CURD

    //Eloquent ORM public function orm1() { //all(); 返回所有数据: /*$students=Student::all(); dd($students);* ...

  2. Laravel之Eloquent ORM

    一.ORM编程思想 1.1 Active Record 设计模式 Active Record 是一种数据访问设计模式,它可以帮助你实现数据对象Object到关系数据库的映射.应用Active Reco ...

  3. Laravel使用Eloquent ORM操作数据库

    1.定义模型 <?php namespace App; use Illuminate\Database\Eloquent\Model; class Flight extends Model{ p ...

  4. Laravel之Eloquent ORM访问器调整器及属性转换

    一.查询构建器的get方法 查询构建器的get方法返回了一个集合 $users = App\User::where('active', 1)->get(); foreach ($users as ...

  5. laravel 5.1 使用Eloquent ORM 操作实例

    Laravel 的 Eloquent ORM 提供了更优雅的ActiveRecord 实现来和数据库的互动. 每个数据库表对应一个模型文件. 数据库配置 .env文件(也可以直接修改config/da ...

  6. Laravel Eloquent ORM

    Eloquent ORM 简介 基本用法 集体赋值 插入.更新.删除 软删除 时间戳 查询范围 关系 查询关系 预先加载 插入相关模型 触发父模型时间戳 与数据透视表工作 集合 访问器和调整器 日期调 ...

  7. [转]Laravel 4之Eloquent ORM

    Laravel 4之Eloquent ORM http://dingjiannan.com/2013/laravel-eloquent/ 定义Eloquent模型 模型通常放在app/models目录 ...

  8. Eloquent ORM 之关联查询

    小伙伴们好,本文是在我的前一篇随笔的基础上完成的,还没有浏览的同学,请移尊驾哦 Eloquent ORM学习笔记. 前一篇文章用到了leftJoin方法,其实Eloquent对于模块之间的关联查询有自 ...

  9. Laravel 数据库操作 Eloquent ORM

    laravel 操作数据库一般都使用它的Eloquent ORM才操作 建立模型 <?php namespace App; use Illuminate\Database\Eloquent\Mo ...

随机推荐

  1. php 内核变量 引用计数器写时复制

    写时复制,是一个解决内存复用的方法,就是你在php语言层,如$d=$c=$b=$a='value';把$a赋给另一个或多个变量,这时这个变量都只占用一个内存块,当其中一个变量值改变时,才会开辟另一个内 ...

  2. Hoof, Paper, Scissors(USACO)

    题目大意: 一种游戏(类似于石头剪刀布):两个人分别给出一个字母,然后比较:H>S,S>P,P>H,我们已知对手的字母顺序,求在前n局中我们最多能赢多少次. 由于出字母的人非常懒,所 ...

  3. mogilefsdBUG mogilefsd[15624]: crash log: Modification of a read-only value attempted at /usr/local/share/perl5/Sys/Syscall.pm line 227

    mogilefsd[15624]: crash log: Modification of a read-only value attempted at /usr/local/share/perl5/S ...

  4. python+requests接口自动化完整项目设计源码【转载】

    本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/tag/python%E6%8E%A5%E5%8F%A3%E8%87%AA%E5%8A%A8%E ...

  5. poj 1106(半圆围绕圆心旋转能够覆盖平面内最多的点)

    Transmitters Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4955   Accepted: 2624 Desc ...

  6. 错误整理:容器启动报错com.sun.faces.config.WebConfiguration cannot be cast to com.sun.faces.config....

    错误集锦: 今天用Jboss部署一个web项目的时候报了个奇怪的错误(用Tomcat部署运行良好),错误信息如下:java.lang.ClassCastException: com.sun.faces ...

  7. DB2如何调整表空间大小

    DB2如何调整表空间大小 刚刚接到客户那边打的电话,程序一直报错,所有的业务都做不了,拷贝了一份应用服务器(weblogic)的日志,日志里显示: WARN : 2009-06-18 16:24:32 ...

  8. extjs grid合并单元格

    http://blog.csdn.net/kunoy/article/details/7829395 /** * Kunoy * 合并单元格 * @param {} grid 要合并单元格的grid对 ...

  9. 彻底解决INSTALL_FAILED_UPDATE_INCOMPATIBLE的安装错误、安装包与之前设备上的安装包签名不一致

    有时候开发的问题:会遇到在公司上班的时候,公司的IDE能跑程序,把程序拷贝回家,再跑一次,就会出现以下错误: INSTALL_FAILED_UPDATE_INCOMPATIBLE 原因:就是你的安装包 ...

  10. 事件溯源模式(Event Sourcing Pattern)

    此文翻译自msdn,侵删. 原文地址:https://msdn.microsoft.com/en-us/library/dn589792.aspx 本文介绍了一种有利于物化(materialize)领 ...