laravel ORM关联关系中的 with和whereHas用法
with 渴求式预加载 可以有效的避免 N+1 问题,用法如下:
$books = App\Book::with('author')->get();
如果有多个关联关系可以用“,”隔开,还可以使用闭包来对关联关系进行限制,向下面这样:
//查询所有的用户,查询条件:发布过标题中有first的post $users = User::with(['posts' => function ($query) { $query->where('title', 'like', '%first%'); }])->get();
结果会查找所有的用户,返回的每个用户信息中都会多一个posts数组,但是posts数组可能为空(不符合查询要求),没有筛选功能
with 更像 sql 中的 join,就是你存不存都有执行,存在结果不为空,存在关联结果,不存在结果为空,关联结果为空
whereHas 查询存在的关联关系,还有对应的 whereDoesntHave ,查询不存在的关联关系,像下面这样:
// 获取发布文章标题中有first的用户 $users= User::whereHas('posts', function ($query) { $query->where('title', 'like', '%first%'); })->get();
结果会查找发布过文章标题包含first的部分用户,有筛选功能
whereHas 就是在关联关系上筛选,只筛选符合条件的,适合查找 存在不存在
感觉 with 更多的用在查看详情的时候,你想知道你的查看对象的具体信息,关联到的内容是怎样的,
而 whereHas 更多的用在筛选,你要把符合条件的关联关系的对象给他找出来。
就像用户发文章, user 存在关联关系 post,如果是 user->with('post'),你会得到所有用户和用户发布的文章信息,没发文章的用户就没有文章信息,如果是 user->whereHas('post'), 那拿到的可就是发过文章的用户。
这就是我对 with 和 whereHas 的一些理解了
以上这篇laravel ORM关联关系中的 with和whereHas用法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。
相关推荐
-
Laravel Eloquent ORM 多条件查询的例子
一.需求: 在数据搜索时最常见的就是调用同一个方法查询,而查询的字段却可能是其中一个或其中的几个字段一起组合查询,例如:对列表的搜索,基本上都是几个字段随意组合搜索.那么在model里就需要判断有那个字段组合,怎么组合. 网上找了很久,Laravel群里也问了几个,都说没有写过,于是自己写个吧.话不多说,见代码: function findByParam($param = array()) { $select = new Customer(); if (isset($param['name'])
-
laravel orm 关联条件查询代码
如下所示: public function a() { return $this->belongsTo('App\Models\a', 'aid'); } $model = $this->whereHas('a', function ($query) use ($search) { $query->where('username', 'like', '%' . $search['username'] . '%'); })->with(['a:id,username'])->g
-
浅谈laravel中的关联查询with的问题
表结构 主表结构: Create Table CREATE TABLE `user` ( `uid` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `email` varbinary(255) NOT NULL, PRIMARY KEY (`uid`) ) ENGINE=InnoDB AUTO_INCREMENT=114001 DEFA
-
Laravel关系模型指定条件查询方法
对于关系模型来说,有时候我们需要甄别关联后结果,例如,班级和学生是一对多关联,我现在查询班级,但是想只显示正常状态,即状态为1的学生,因为有的学生从这个班级里面删除了,状态是4,那么我们在查询的时候就可以使用如下语法: 1.定义关联关系: Class模型: public function learners() { return $this->belongsToMany('App\Models\Customer', 'learner_relation', 'class_id', 'learner_
-
Laravel Eloquent ORM 实现查询表中指定的字段
在使用Laravel ORM的Model方法find, get, first方法获取数据对象时返回的数据对象的attributes属性数组里会包含数据表中所有的字段对应的键值关系, 那么如何在ORM查询时只返回数据表中指定字段的数据呢?很多时候,文档上没有写明的用法需要我们去看源码来探究的,下面我们就来看一下这三个方法的实现. 由于ORM依赖了QueryBuilder来实现查询, 在QueryBuilder的源码里通过查看get,first方法的实现可以到,他们都可以接收一个数组参数来指定要查询
-
laravel多条件查询方法(and,or嵌套查询)
说明 在日常开发中,经常会需要写多条件的数据库查询语句.在使用框架的情况下,单纯使用原生sql查询会导致结果与model无法对应,也就没有办法使用框架的一些便利的方法对结果集进行处理.尤其是laravel提供了非常多的对查询结果集进行处理的工具.所以最好是使用laravel提供的ORM进行多条件的数据库查询. 问题 比如需要执行这样一条sql语句 select * from homework where (id between 1 and 10 or id between 50 and 70)
-
laravel ORM关联关系中的 with和whereHas用法
with 渴求式预加载 可以有效的避免 N+1 问题,用法如下: $books = App\Book::with('author')->get(); 如果有多个关联关系可以用","隔开,还可以使用闭包来对关联关系进行限制,向下面这样: //查询所有的用户,查询条件:发布过标题中有first的post $users = User::with(['posts' => function ($query) { $query->where('title', 'like', '%
-
浅谈laravel orm 中的一对多关系 hasMany
个人对于laravel orm 中对于一对多关系的理解 文章表 article,文章自然可以评论,表 comment 记录文章的评论,文章和评论的关系就是一对多,一篇文章可以有多个评论. 在 comment 表中有字段 article 记录评论所属文章,文章和评论的关系如下: article:id ... ... comment : id ... ... article_id 在 comment 表中有关联 article 的外键 article_id,所以在 Comment 模型中是 be
-
laravel ORM 只开启created_at的几种方法总结
方法一: class User extends Model { public $timestamps = false;//关闭自动维护 public static function boot() { parent::boot(); #只添加created_at不添加updated_at static::creating(function ($model) { $model->created_at = $model->freshTimestamp(); //$model->updated_
-
Laravel ORM对Model::find方法进行缓存示例详解
前言 前段时间做项目时候,想要在不改变方法签名的情况下,给 Model::find 方法做个缓存.而且想要做到即插即用.下面话不多说了,来一起看看详细的介绍哦. 1.先看一下当我们调用 find 方法时,框架干了什么? 找到 Illuminate\Database\Eloquent\Model 的代码,搜索 find,没有该方法.看来是走了 __callStatic 这个魔术方法.该方法里只有一行代码: return (new static)->$method(...$parameters);
-
Laravel关联模型中过滤结果为空的结果集(has和with区别)
首先看代码: $userCoupons = UserCoupons::with(['coupon' => function($query) use($groupId){ return $query->select('id', 'group_id', 'cover', 'group_number', 'group_cover')->where([ 'group_id' => $groupId, ]); }]) // 更多查询省略... 数据结构是三张表用户优惠券表(user_coup
-
Laravel ORM 数据model操作教程
随机查询 $data=Move::where('release',1) ->where('is_hot',1) ->where('is_status',1) ->orderBy(\DB::raw('RAND()')) ->take(4) ->get(); 1.ORM操作需要创建对应的model class User extends Eloquent 2.有两种方式使用数据操作对象 a. 使用new关键字创建对象后执行对象的方法 b. 直接调用static方法(实际并发静态方法
-
laravel中的错误与日志用法详解
本文实例讲述了laravel中的错误与日志用法.分享给大家供大家参考,具体如下: 日志 laravel中的日志是基于monolog而封装的.laravel在它上面做了几个事情: ① 把monolog中的addInfo等函数简化成为了info这样的函数 ② 增加了useFiles和useDailyFiles两个参数,使得做日志管理和切割变的容易了 ③ 如果要调用monolog的方法需要调用callMonolog函数 好了,看下下面几个需求怎么实现: 将不同的日志信息存放到不同的日志中去 这个需求很
-
laravel 5.4中实现无限级分类的方法示例
前言 本文主要给大家介绍的是关于laravel 5.4中实现无限级分类的相关内容,分享出来供有需要的朋友们参考学习,下面话不多说,来一起看看详细的介绍吧. 方法如下: 1.建立表 php artisan make:migration create_category_table --create=category 在database/migrations/下找到你的迁移文件 建入: <?php use Illuminate\Support\Facades\Schema; use Illuminat
-
laravel 5.3中自定义加密服务的方案详解
前言 本文介绍的是laravel 5.3中自定义加密服务的方案,利用laravel的服务容器,实现自定义加密服务注册(示例是支持长字符串的RSA加密),下面来看看详细的介绍: 创建加密解密服务类 文件地址 /app/Service/Common/CryptService.php 代码如下 下面这个是个人写的支持长字符串的RSA加密类作为示例,自定义加密的话只需更改这个文件的代码就好,其它操作只是为了实现依赖注入. <?php namespace App\Service\Common; class
-
关于laravel 数据库迁移中integer类型是无法指定长度的问题
laravel数据库迁移中integer类型是无法指定长度的,很多小伙伴对integer类型传递第二个参数后会发现迁移报以下错误 Syntax error or access violation: 1075 Incorrect table definition; there can be only one auto column and it must be defined as a key 查看了sql代码后发现通过integer指定长度创建的子段自动添加了auto increament 以及
随机推荐
- redis中事务机制及乐观锁的实现
- jstl 字符串处理函数
- 用margin和overflow属性实现div间距的方法
- NodeJS使用formidable实现文件上传
- Windows下Postgresql数据库的下载与配置方法
- JQuery实现自定义对话框的代码
- 详解win7 cmd执行vue不是内部命令的解决方法
- 用 Net 命令使局域网文件批量同步更新
- 浅析Java编程中类和对象的定义
- python实现RSA加密(解密)算法
- 解决iframe的frameborder在chrome/ff/ie下的差异
- PHP数据库编程之MySQL优化策略概述
- Vue.js教程之计算属性
- 3分钟用Docker搭建一个Minecraft服务器
- jQuery异步上传文件插件ajaxFileUpload详细介绍
- SQL学习笔记六 union联合结果集使用
- MySQL 实现双向复制的方法指南
- 原生javascript实现分页效果
- Android判断SD卡是否已经挂载的方法
- Java实现ftp上传下载、删除文件及在ftp服务器上传文件夹的方法