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


Posted in PHP onApril 01, 2017

在 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 字段,如果这样构造查询的话,返回的查询结果如图:

PHP中Laravel 关联查询返回错误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

查询结果如图:

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

使用 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的解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
BBS(php & mysql)完整版(一)
Oct 09 PHP
joomla内置的表单验证功能使用方法
Jun 11 PHP
允许phpmyadmin空密码登录的配置方法
May 29 PHP
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
Feb 06 PHP
PHP PDOStatement对象bindpram()、bindvalue()和bindcolumn之间的区别
Nov 20 PHP
PHP文件缓存类示例分享
Jan 30 PHP
Thinkphp调用Image类生成缩略图的方法
Mar 07 PHP
ThinkPHP3.2.2实现持久登录(记住我)功能的方法
May 16 PHP
php实现图片上传时添加文字和图片水印技巧
Apr 18 PHP
PHP实现的链式队列结构示例
Sep 15 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
Sep 15 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
Feb 19 PHP
php获取ip及网址的简单方法(必看)
Apr 01 #PHP
Thinkphp事务操作实例(推荐)
Apr 01 #PHP
完美解决thinkphp唯一索引重复时出错的问题
Mar 31 #PHP
ThinkPHP Where 条件中常用表达式示例(详解)
Mar 31 #PHP
浅谈PHP的exec()函数无返回值排查方法(必看)
Mar 31 #PHP
关于PHP通用返回值设置方法
Mar 31 #PHP
PHP针对中英文混合字符串长度判断及截取方法示例
Mar 31 #PHP
You might like
php 调用远程url的六种方法小结
2009/11/02 PHP
PHP中的integer类型使用分析
2010/07/27 PHP
解决PHP4.0 和 PHP5.0类构造函数的兼容问题
2013/08/01 PHP
微信支付开发发货通知实例
2016/07/12 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
2019/08/09 PHP
自适应图片大小的弹出窗口
2006/07/27 Javascript
将string解析为json的几种方式小结
2010/11/11 Javascript
jQuery操作Table技巧大汇总
2016/01/23 Javascript
基于Bootstrap实现Material Design风格表单插件 附源码下载
2016/04/18 Javascript
gulp-htmlmin压缩html的gulp插件实例代码
2016/06/06 Javascript
JavaScript中的this引用(推荐)
2016/08/05 Javascript
深入浅析javascript继承体系
2017/10/23 Javascript
windows下更新npm和node的方法
2017/11/30 Javascript
jQuery实现的两种简单弹窗效果示例
2018/04/18 jQuery
解决echarts的多个折现数据出现坐标和值对不上的问题
2018/12/28 Javascript
js getBoundingClientRect使用方法详解
2019/07/17 Javascript
JavaScript 自定义html元素鼠标右键菜单功能
2019/12/02 Javascript
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
2021/01/05 Vue.js
常见的在Python中实现单例模式的三种方法
2015/04/08 Python
关于python的list相关知识(推荐)
2017/08/30 Python
Python编程scoketServer实现多线程同步实例代码
2018/01/29 Python
pyqt5的QComboBox 使用模板的具体方法
2018/09/06 Python
浅析Python 3 字符串中的 STR 和 Bytes 有什么区别
2018/10/14 Python
pycharm实现在子类中添加一个父类没有的属性
2020/03/12 Python
Python实现将元组中的元素作为参数传入函数的操作
2020/06/05 Python
Python中openpyxl实现vlookup函数的实例
2020/10/28 Python
pycharm2020.1.2永久破解激活教程,实测有效
2020/10/29 Python
基于注解实现 SpringBoot 接口防刷的方法
2021/03/02 Python
html2canvas生成清晰的图片实现打印的示例代码
2019/09/30 HTML / CSS
Laravel中Kafka的使用详解
2021/03/24 PHP
电子商务专业在校生实习自我鉴定
2013/09/29 职场文书
售后服务科岗位职责范文
2013/11/13 职场文书
护士辞职信范文
2014/01/19 职场文书
工作散漫检讨书
2014/09/16 职场文书
新员工试用期工作总结2015
2015/05/28 职场文书
Python实现随机生成迷宫并自动寻路
2021/06/13 Python