博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
记一次laravel远程关联查询
阅读量:6348 次
发布时间:2019-06-22

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

如图,一个服务(service)对应一个用户(user),一个用户对应多个标签(tag),同时一个tag也可以通过中间表(pivot)对应对个用户。

现在业务需求如下:查service,这些service对应的user同时拥有tag1、tag2、tag3、tag4标签。

一个很容易犯的错误如下:

$tags = ['tag1', 'tag2', 'tag3', ''tag4];$query = ServiceModel::query() $query->whereHas('user.tags', function($query) use($tags) {    foreach($tags as $tag){        $query->where('tag_name', '=', $tag);    }}); $query-get();

这翻译过来是:找到某service,该service有user,且user有tag,这些tag的tag_name还要满足既等于tag1又等于tag2又等于tag3还等于tag4。

很显然,查询的结果为空,因为一个tag只有一个tag_name。

那换种方式:

$tags = ['tag1', 'tag2', 'tag3', ''tag4];$query = ServiceModel::query()$query->whereHas('user.tags', function($query) use($tags) {    $query->whereIn('tag_name', $tags);});$query-get();

这样也不对,因为要同时拥有4种标签,这种写法标签间是OR的关系

翻译过来是:找到某service,该service有user,且user有tag,这些tag的tag_name只要出现在tag1、tag2、tag3、tag4中就选出来。

那如何找到某service,该service对应的user的标签既有tag1又有tag2又有tag3还有tag4呢?

其实只要把foreach置于外部即可:

$tags = ['tag1', 'tag2', 'tag3', ''tag4];$query = ServiceModel::query()foreach($tags as $tag){    $query->whereHas('user.tags', function($query) use($tag) {        $query->where('tag_name', '=', $tag);    });}$query-get();

这样翻译过来:(第一个循环)找到某service,该service有user,且user有tag,tag为tag1 ;循环加入的条件都是AND的关系。

 其实还是化繁为简的思想:

找到某service,其对应user同时拥有多个tag的查询太难了,挺绕,那先找到只拥有1个tag(如tag1)的全部service记录总可以吧:

$query = ServiceModel::query()$query->whereHas('user.tags', function($query) use($tag) {    $query->where('tag_name', '=', 'tag1');});

这和laravel手册上基于存在的关联查询例子几乎一样,那找到只拥有tag2的service记录,不就是把where里面的tag1换成tag2吗,同理其他tag,那这不就相当于对tag数组循环并添加whereHas条件吗...

 

转载于:https://www.cnblogs.com/SHQHDMR/p/10285589.html

你可能感兴趣的文章
python初学—-实现excel里面读数据进行排序
查看>>
用户体验升级后 “谁行谁上”让百度Q4财报更有底气
查看>>
直播相关学习链接
查看>>
使用RPM包工具和源码包编译安装Linux应用程序
查看>>
VoIP——开启免费通话新时代的先锋
查看>>
Linux下rsync的用法
查看>>
apache虚拟主机、日志轮询、日志统计、去版本优化
查看>>
java代码实现开启openoffice服务和关闭sffice.exe进程
查看>>
docker镜像的使用方法
查看>>
提升HTTPS安全评级
查看>>
iOS开发过程中的心得
查看>>
QOS配置命令
查看>>
linux安装搭建media-wiki
查看>>
使用 MPI for Python 并行化遗传算法
查看>>
widget
查看>>
paramiko安装及使用
查看>>
Java私塾:研磨设计模式 之 访问者模式(Visitor)
查看>>
我的友情链接
查看>>
《Python网络数据采集》读书笔记(六)
查看>>
Linux必学的60个命令
查看>>