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

(0)

相关推荐

  • Laravel实现自定义错误输出内容的方法

    本文实例讲述了Laravel实现自定义错误输出内容的方法.分享给大家供大家参考,具体如下: 这里分析一下laravel对于提交的数据进行验证,怎么自定义错误输出的内容 在根目录下运行命令 php artisan make:request PostUpdateRequest 会在app\Http\Requests目录下创建PostUpdateRequest文件 比如我设置 public function rules() { return [ 'posts_title' => 'required',

  • Laravel5.1自定义500错误页面示例

    本文实例讲述了Laravel5.1自定义500错误页面的方法.分享给大家供大家参考,具体如下: Laravel 5.1中500错误是程序错误,程序错误一定是系统自带的500错误,可以通过以下步骤简单实现自定义500错误页面. 编辑PHP文件app/Exceptions/Handler.php内容如下: public function render($request, Exception $e) { if ($e instanceof ModelNotFoundException) { $e =

  • Laravel中常见的错误与解决方法小结

    一.报错: 「Can't swap PDO instance while within transaction」 通过查询 Laravel 源代码,可以确认异常是在 setPdo 方法中抛出的: <?php public function setPdo($pdo) { if ($this->transactions >= 1) { throw new RuntimeException(" Can't swap PDO instance while within transact

  • Laravel 5.3 学习笔记之 错误&日志

    1.简介 Laravel默认已经为我们配置好了错误和异常处理,我们在App\Exceptions\Handler类中触发异常并将响应返回给用户.本教程我们将深入探讨这个类. 此外,Laravel还集成了Monolog日志库以便提供各种功能强大的日志处理器,默认情况下,Laravel已经为我们配置了一些处理器,我们可以选择单个日志文件,也可以选择记录错误信息到系统日志. 2.配置 错误详情显示 配置文件config/app.php中的debug配置项控制浏览器显示的错误详情数量.默认情况下,该配置

  • 解决laravel 5.1报错:No supported encrypter found的办法

    本文主要介绍了关于解决laravel 5.1报错:No supported encrypter found的办法,分享出来供大家参考学习,下面来看看详细的介绍: 问题描述 在使用laravel5.1进行项目开发的时候,出现了"No supported encrypter found. The cipher and / or key length are invalid."的报错信息,导致页面无法显示. 网上的绝大多数答案都是直接执行PHP artisan key:generate即可.

  • laravel中的错误与日志用法详解

    本文实例讲述了laravel中的错误与日志用法.分享给大家供大家参考,具体如下: 日志 laravel中的日志是基于monolog而封装的.laravel在它上面做了几个事情: ① 把monolog中的addInfo等函数简化成为了info这样的函数 ② 增加了useFiles和useDailyFiles两个参数,使得做日志管理和切割变的容易了 ③ 如果要调用monolog的方法需要调用callMonolog函数 好了,看下下面几个需求怎么实现: 将不同的日志信息存放到不同的日志中去 这个需求很

  • 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')

  • mysql一对多关联查询分页错误问题的解决方法

    xml问价中查询数据中包含list,需要使用collection <resultMap id="XX" type="com.XXX.XXXX"> <id column="o_id" jdbcType="BIGINT" property="id" /> <result column="o_user_id" jdbcType="BIGINT"

  • Vue.js 中 axios 跨域访问错误问题及解决方法

    1.假如访问的接口地址为 http://www.test.com/apis/index.php  (php api 接口) 2.而开发地址为http://127.0.0.1:8080,当axios发起请求时,出现如下错误: Failed to load http://www.test.com/apis/index.php?&act=login: The value of the 'Access-Control-Allow-Origin' headerin the response must no

  • 关于oracle中clob字段查询慢的问题及解决方法

    最近在用oracle的过程中用到了对blob字段模糊查询的问题,对oracle来说,我并不是高手,找了很多的资料终于能够查出来了. blob字段直接用 select * from table_name where column like '%%'查找的时候是不能实现的 ,主要是字段类型不符,就想到了 字段转换成varchar2类型,然后再进行查询 select * from table_name where utl_raw.cast_to_varchar2(column) like '%orac

  • vue中配置mint-ui报css错误问题的解决方法

    在vue2.0中引入了mint-ui后总是报一个css的错误 但是package.json中已经配置了css-loader style-loader ,webpack.config中也已经配置了css,还是报这个错误,相反,如果把webpack.config中css的配置注释掉就不会出错,这是为什么呢? 因为 在webpack.config中没有设置好css引入的目录,因为默认情况下我们只会引入/src/目录下的css, 但是mint-ui是要冲node_modules目录去引入的,所以在web

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

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

  • 浅谈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

  • JPA如何使用nativequery多表关联查询返回自定义实体类

    目录 JPA nativequery多表关联查询返回自定义实体类 JPA多表关联的实现方式 优缺点对比 使用sql并返回自定义实体类 JPA多表关联动态查询(自定义sql语句) 实体类 注解解释 测试类 打印结果 TestVo实体接收类 JPA nativequery多表关联查询返回自定义实体类 JPA官方推荐的多表关联查询使用不便,接触的有些项目可能会使用JPA 做简单查询,Mybaits做复杂查询.所以想要寻找一种好用的解决方案. JPA多表关联的实现方式 1.使用Specification

  • mybatis主从表关联查询,返回对象带有集合属性解析

    目录 主从表关联查询,返回对象带有集合属性 VersionResult为接收返回数据对象 UpdateRecordEntity为从表数据 mapper.xml写法,这个是关键 sql查询语句 执行sql返回的数据 页面调取接口 mybatis关联查询(对象嵌套对象) 一种是用关联另一个resultMap的形式 一种联合查询(一对一)的实现 主从表关联查询,返回对象带有集合属性 昨天有同事让我帮着看一个问题,mybatis主从表联合查询,返回的对象封装集合属性.我先将出现的问题记录一下,然后再讲处

  • laravel Validator ajax返回错误信息的方法

    将return back()->withErrors($validator->errors())->withInput();替换为下面的代码 $validator = \Validator::make($request->input(), $rules, $messages); if ($validator->fails()) { //将返回错误循环组装成字符串 $arr = []; foreach ($validator->getMessageBag()->to

随机推荐