PHP中Laravel 关联查询返回错误id的解决方法

在 Laravel Eloquent 中使用 join 关联查询,如果两张表有名称相同的字段,如 id,那么它的值会默认被后来的同名字段重写,返回不是期望的结果。例如以下关联查询:

PHP

$priority = Priority::rightJoin('touch', 'priorities.touch_id', '=', 'touch.id') ->where('priorities.type', 1) ->orderBy('priorities.total_score', 'desc') ->orderBy('touch.created_at', 'desc') ->get(); $priority = Priority::rightJoin('touch', 'priorities.touch_id', '=', 'touch.id') ->where('priorities.type', 1) ->orderBy('priorities.total_score', 'desc') ->orderBy('touch.created_at', 'desc') ->get();

priorities 和 touch 这两张表都有 id 字段,如果这样构造查询的话,返回的查询结果如图:

Laravel 关联查询返回错误的 id

这里 id 的值不是 priorities 表的 id 字段,而是 touch 表的 id 字段,如果打印出执行的 sql 语句:

select * from `priorities` right join `touch` on `priorities`.`touch_id` = `touch`.`id` where `priorities`.`type` = '1' order by `priorities`.`total_score` desc, `touch`.`created_at` desc select * from `priorities` right join `touch` on `priorities`.`touch_id` = `touch`.`id` where `priorities`.`type` = '1' order by `priorities`.`total_score` desc, `touch`.`created_at` desc

查询结果如图:

使用 sql 查询的结果实际上是对的,另外一张表重名的 id 字段被默认命名为 id1,但是 Laravel 返回的 id 的值却不是图中的 id 字段,而是被重名的另外一张表的字段重写了。

解决办法是加一个 select 方法指定字段,正确的构造查询语句的代码:

PHP

$priority = Priority::select(['priorities.*', 'touch.name', 'touch.add_user']) ->rightJoin('touch', 'priorities.touch_id', '=', 'touch.id') ->where('priorities.type', 1) ->orderBy('priorities.total_score', 'desc') ->orderBy('touch.created_at', 'desc') ->get(); $priority = Priority::select(['priorities.*', 'touch.name', 'touch.add_user']) ->rightJoin('touch', 'priorities.touch_id', '=', 'touch.id') ->where('priorities.type', 1) ->orderBy('priorities.total_score', 'desc') ->orderBy('touch.created_at', 'desc') ->get();

这样就解决了问题,那么以后就要注意了,Laravel 两张表 join 的时候返回的字段最好要指定。

这算不算是 Laravel 的一个 bug 呢?如果一个字段的值被同名的字段值重写了,这种情况要不要报一个错误出来,而不能默认继续执行下去。

github 上有人也提出了同样的问题,作者也提供了解决办法,但并没其他更好的方案。

Laravel 版本:5.3

链接:https://github.com/laravel/framework/issues/4962

以上所述是小编给大家介绍的Laravel 关联查询返回错误的 id的解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

时间: 2024-10-26 18:05:10

PHP中Laravel 关联查询返回错误id的解决方法的相关文章

电脑中出现共享打印机连接错误问题的解决方法

  电脑中出现共享打印机连接错误问题的解决方法         1.被共享的打印机主机电脑需要开启Guest用户,右击"我的电脑"-"管理"-"本机使用者和群组"-"使用者",双击"Guest"用户; 2.取消勾选"账户已停用",点击确定; 3.如果提示无法保存打印机设置,操作无法完成(错误0x000006d9),则需要开启Windows firewall服务项,并确保服务Compute

Chrome中模态对话框showModalDialog返回值问题的解决方法_javascript技巧

没有找到太好的解决办法,暂时处理方法是,在弹出窗口中同时给 window.opener.ReturnValue 赋返回值.这样在关闭窗口后,通过下面的代码取得返回值: 复制代码 代码如下: var val = window.showModalDialog(...); if(!val) val= window.ReturnValue; 这样在IE.FF.及Chrome中,都可以得到返回值了.

ThinkPHP查询返回简单字段数组的方法_php实例

本文实例讲述了ThinkPHP查询返回简单字段数组的方法,是ThinkPHP程序设计中一个很实用的功能.具体方法如下: 通常来说使用select语句.返回的都是结构较复杂的字段数组.如以下是一个简单的查询: $map['parentid'] = $id; $sub_ids = D('Category')->where($map)->field("catid")->select(); 查询后,得到的结果是: [{"catid":"23&qu

PHP编译过程中常见错误信息的解决方法

PHP编译过程中常见错误信息的解决方法 在CentOS编译PHP5的时候有时会遇到以下的一些错误信息,基本上都可以通过yum安装相应的库来解决.以下是具体的一些解决办法: checking for BZip2 support- yes checking for BZip2 in default path- not found configure: error: Please reinstall the BZip2 distribution Fix: yum install bzip2-devel

myeclipse-将web项目导入到MyEclipse中一直报的这个错误该如何解决?

问题描述 将web项目导入到MyEclipse中一直报的这个错误该如何解决? 解决方案 应该不是代码的问题,可能是设置问题. 解决方案二: 应该是缺包导致的吧 解决方案三: eclipse导入myeclipse的web项目没法识别问题解决eclipse导入myeclipse的web项目没法识别问题解决eclipse导入myeclipse的web项目没法识别问题解决 解决方案四: restart 试试 ,

jQuery中ajax的使用与缓存问题的解决方法

本篇文章主要介绍了jQuery中ajax的使用与缓存问题的解决方法.需要的朋友可以过来参考下,希望对大家有所帮助 1:GET访问 浏览器 认为 是等幂的 就是 一个相同的URL 只有一个结果[相同是指 整个URL字符串完全匹配] 所以 第二次访问的时候 如果 URL字符串没变化 浏览器是 直接拿出了第一次访问的结果   POST则 认为是一个 变动性 访问 (浏览器 认为 POST的提交 必定是 有改变的)   防止 GET 的 等幂 访问 就在URL后面加上 ?+new Date();,[总之

宽带连接错误769的解决方法

宽带连接错误769的解决方法: 方法一:有本地连接,但是被禁止首先点击电脑桌面右下角的网络. 在网络列表中打开网络共享中心 在网络共享中心打开更改适配器设置. 找到本地连接 右键单击本地连接,选择连接. 等待连接完毕,这样我们就完成了设置. 方法二:没有本地连接怎么办如果你的电脑的网络中心没有本地连接,那么你需要调出本地连接.首先点击开始--控制面板. 在控制面板中找到系统和安全 在系统和安全里找到管理工具 在管理工具中找到服务,并打开之 在服务中,找到network connection,右键

win8宽带连接错误813的解决方法

  现在的社会无线网铺天盖地,不管是家庭.公司还是商业大楼中都设置了无线网,这也能说明我们国家的互联网发展迅速,已经变成一个互联网大国.即使无线网使用的如此频繁,但是网线连接一直没有被磨灭掉,能够保存必有他的优势之处,理性的分析来看,网线连接的电脑网速更加快,不容易存在信号不稳定的情况,所以网线连接一直难以被淘汰.但是最近有用户反映来说,在使用宽带连接的时候,总是显示连接失败,出现错误提示813的情况,下面小编就来为大家解答,win8电脑宽带连接失败,错误提示813怎么办? win8宽带连接错误

批处理命令篇--配置免安装mysql 5.6.22, 以及1067错误的一个解决方法

  mysql 服务启动出现1067错误的一个解决方法: 当服务启动出现1067错误时,可查看"windows 事件查看器",发现类似错误提示 Can't find messagefile 'F:\    ools\mysql\mysql-5.6.22-winx64\share\errmsg.sys', 但是配置似乎没问题: basedir=F:\tools\mysql\mysql-5.6.22-winx64datadir=F:\tools\mysql\mysql-5.6.22-win