首页 > 解决方案 > findOrFail 返回正确和错误的记录

问题描述

我有一个名为Location的模型,正在尝试获取特定实体:/api/location/2

当我这样做时,我得到了 ID 为 2 的记录的结果,但还有一条额外的记录:

{
id: 2,
name: "Considine Group",
address: "Rau Union",
uri: "http://localhost:6890/api/location/2"
},
{
id: 467,
name: "Lubowitz, Parker and Kuhn",
address: "Bernice Ports",
uri: "http://localhost:6890/api/location/467"
}

我在控制器中的显示功能非常简单:

    public function show(ShowLocationRequest $request, Location $Location)
    {
        $Loc = Location::with('company:id,name')->findOrFail($Location); 
        return response()->json(["data"=>$Loc],200);
    }

即使我删除公司关系,它也会做同样的事情。FirstOrFail 会抛出错误: Invalid parameter number: mixed named and positional parameters

看着望远镜,我看到 select 语句在那里,正如我所期望的那样:
select * from locationswhere id= '2' and locations. deleted_atis null limit 1

这是我感到困惑的地方,就在望远镜中的那个查询之上,还有一个(也是最终的)查询:

select
  *
from
  `locations`
where
  `locations`.`id` in (
    2,
    'Considine Group',
    'Rau Union',
    '13552 Fritsch Underpass',
    'Janellefort',
    'MO',
    '16407-4623',
    '',
    '467-980-9647 x03308',
    '',
    '',
    'nova.weimann@bartell.net',
    '',
    '',
    '',
    '',
    'active',
    0,
    '1573583520',
    '1573583520',
    'http://localhost:6890/api/location/2'
  )
  and `locations`.`deleted_at` is null


当我在 MySql 工作台中手动运行该查询时,我得到了两个结果,就像在响应中一样。

谁能帮我理解问题出在哪里?我能够在其他模型上重现这一点。它在同一个实体之间是一致的(位置 id 2 总是会这样做),但位置 id 3 不会。
任何帮助表示赞赏。

标签: laravel

解决方案


您将整个Location模型传递给findOrFail.

当您键入提示 id 时,它会执行查询Location以为您找到模型,并将其保存到变量中。这导致findOrFail查找您传递给它的集合中的每个键。第二行它的发现是由于id位置 2 的电话号码中存在的可能被-之后截断的。

而不是方法中的类型提示$location,只需执行

public function show(ShowLocationRequest $request, $Location)

这将导致您的查询仅搜索路线中的 id,而不是位置模型中的每个键。

选项二是留下类型提示并在之后加载关系

public function show(ShowLocationRequest $request, Location $location)
{
    $location->load('company,name');
}

推荐阅读