Laravel返回包含第一个模型副本的集合

Laravel返回包含第一个模型副本的集合,laravel,laravel-5,laravel-5.7,data-retrieval,Laravel,Laravel 5,Laravel 5.7,Data Retrieval,我正在开发一个带有PostgreSQL数据库的Laravel5.7API应用程序。相关模型包括:用户客户和员工、汽车和请求 员工用户创建属于客户用户的汽车请求 这些关系是: 作为客户的汽车:用户=n:m 汽车:请求=1:n 用户:作为员工的请求=1:n 温和地说,数据设计是次优的,但无论如何,这是目前已知的现实 现在谈谈实际问题。我想显示客户用户的所有请求: 具有给定$customer->id的客户有n个请求。并且上述调用的结果集合的长度是正确的。但所有这些n个条目都是第一个条目的重复项。意思是

我正在开发一个带有PostgreSQL数据库的Laravel5.7API应用程序。相关模型包括:用户客户和员工、汽车和请求

员工用户创建属于客户用户的汽车请求

这些关系是:

作为客户的汽车:用户=n:m 汽车:请求=1:n 用户:作为员工的请求=1:n 温和地说,数据设计是次优的,但无论如何,这是目前已知的现实

现在谈谈实际问题。我想显示客户用户的所有请求:

具有给定$customer->id的客户有n个请求。并且上述调用的结果集合的长度是正确的。但所有这些n个条目都是第一个条目的重复项。意思是:我得到一个包含n个Request1实例的列表

为什么第一个调用返回同一模型对象的引用列表?这是已知的错误吗

补充资料

关系:

这个查询是正确的

我记录了数据库请求,得到了生成的语句

SELECT *
FROM "request"
INNER JOIN "user_car" ON "user_car"."car_id" = "request"."car_id"
INNER JOIN "user" ON "user"."id" = "user_car"."user_id"
WHERE "user"."id" = 1;
,并手动执行。结果表按预期包含n个不同的条目

不仅仅是参考资料

结果集合的条目实例引用了不同的对象:

$test1 = $resultCollection->first();
$test2 = $resultCollection->last();
$test3 = spl_object_hash($test1);
$test4 = spl_object_hash($test2);
Xdebug输出:

$test3 = "0000000077505ccd000000007964e0a8" <-- ccd0
$test4 = "0000000077505c33000000007964e0a8" <-- c330

。。。检索正确的/预期的模型集。

首先,请注意,对象哈希实际上并不完全相同,您可能要处理两个单独的实例

您可能遇到的是列名称不明确的问题。将多个表联接在一起时,任何匹配/重复的列名都将包含最后一个匹配列的值。您的SQLGUI/客户机通常将它们分开。不幸的是,Laravel没有前缀机制,只使用关联数组

假设您的所有表都有一个id主键列,那么结果集中的每个请求对象都可能具有相同的id—您在WHERE条件中传递的用户id


您可以在现有查询中通过显式选择防止歧义所需的列来解决此问题。使用->选择['request.*']将返回的信息限制为请求对象数据。

在查询中,为什么不直接引用关系?您能否显示您在用户、汽车和请求模型中的关系?此外,您不需要在查询中使用->选择行,只需使用get.@eResourcesInc,谢谢您的评论。1.引用关系-你是什么意思$客户->汽车->。。。然后?2显示刚刚更新的关系问题查看附加信息。3. ->选择行-正确,谢谢!在您的解决方案中,为什么不直接设置$requests=$customer->cars->requests?如果这给了您正确的结果,为什么您要将其作为完整的查询来编写,而不仅仅是利用这些关系查询的简单性?@eResourcesInc 1$客户->汽车->请求-这不起作用。Customercars返回一个belongAsmany对象。所以我得到一个对未定义方法的异常调用。。。belongtomany::请求。另外,$customer->cars->requests也不起作用,因为$customer->cars是一个集合,它不知道请求方法。2.为什么?完整查询-是的,我找到了一个有效的解决方案。但我想知道,为什么通过构建器的替代方法不起作用。要么我理解错了,然后我想知道,我的错误是什么,要么它是一个bug,然后我想报告它。当然,它会返回一个关系,但我没有用->get写出整个查询,因为这将取决于您。cars调用返回一组模型,然后可以利用这些模型之间的关系。因此,在汽车模型上使用请求关系,您绝对应该能够遵循两个级别的关系路径,并获得您所需要的。我想我不明白这篇文章的意思,你想知道这是否是一个bug,但可能是一些编码错误,因为这是基本的功能,如果是bug,那么几乎没有一个laravel应用程序可以正常工作。非常感谢你的回答!1对象散列实际上并不完全相同-是的,你是对的。我已经相应地更新了这个问题。谢谢你的解释!我永远也不会想,雄辩者不会在列前加前缀。。。在我看来,这是ORM的一个非常基本的功能。最重要的是:如果我对一个具体的模型类执行一个查询,我假定只获取它的对象,而不需要显式地指定它。无论如何,谢谢你的解释和修复!
$test1 = $resultCollection->first();
$test2 = $resultCollection->last();
$test3 = spl_object_hash($test1);
$test4 = spl_object_hash($test2);
$test3 = "0000000077505ccd000000007964e0a8" <-- ccd0
$test4 = "0000000077505c33000000007964e0a8" <-- c330
Request::whereIn('car_id', $customer->cars()->pluck('id')->toArray())->get();