【问题标题】:Laravel Eloquent returning double array with null propertiesLaravel Eloquent 返回具有空属性的双精度数组
【发布时间】:2020-12-27 06:07:02
【问题描述】:

我正在使用 Laravel Eloquent 查询模型。当有可用记录时,查询返回一个对象数组的结果。

[{id: 2, num: 3}]

当没有可用记录时,Eloquent 返回一个对象数组中的一个数组,其中所有对象属性都为空值。

[[{id: null, num: null}]]

问题是我如何测试是否没有记录或空对象。以下方法均无效:

isset($records) // does not cover empty object
!empty($records) // does not seem to see null properties
count($records) > 0 // sees an array more than zero deep

这是我的查询:

$records = FertilAppUser::select('fertilapp.*')
            ->leftJoin('fertilapp', 'fertilappuser.id', '=', 'fertilapp.fertilappuser_id')
            ->where('fertilappuser.id', '=', $request->get( 'id' ))
            ->groupBy('fertilapp.id')
            ->orderBy('fertilapp.id', 'asc')
            ->get();

必须处理一个空的结果,因为它是可能的,而且它似乎是一件让我很难处理的事情。一切正常,然后我测试空结果并出现错误!

谁能帮我理解为什么结果是不同深度的数组?

如果这两个结果都是对象数组,那将很容易,但我如何检查 !empty($record[0]->id)!empty($record[0][0]->id) 而不会出错。

有趣的是,下面的查询返回一个对象数组或一个空数组[null]

$records = DB::select('SELECT fertilapp.* ' .
                  ' FROM fertilapp ' .
                  ' LEFT JOIN fertilappuser ON fertilappuser.id = fertilapp.fertilappuser_id ' .
                  ' WHERE fertilappuser.id = ? ' .
                  ' GROUP BY fertilapp.id ' .
                  ' ORDER BY fertilapp.id ASC ', [$request->get( 'id' )]);

这可以用上面的方法测试。还是想知道为什么 Eloquent 方法会返回上面的结果。

运行查询后,我检查结果是否可用并循环遍历它们。

if (isset($records) && !empty($records) ) {                        
       foreach ($records as $key => $value) {...}
}

【问题讨论】:

  • 你在查询后用$record做什么?您是否将其包装在 Resource 类中?在任何情况下,$record 都应该是 Eloquent Collection。如果想知道是否为空,请使用收集方法:$record->isEmpty()$record->isNotEmpty()
  • 资源类是什么意思?
  • 使用->isEmpty() / ->isNotEmpty() 是否返回预期值?你是如何“测试”它的?你用什么来转储数据并在数组中获取数组?
  • 我的意思是Eloquent Resource。如果你不使用它并不重要。
  • 我正在使用一个名为FertilAppUser的模型。

标签: php laravel object eloquent


【解决方案1】:

首先,

isset($record) 将始终返回 true,因为您自己设置了 $record 变量。

第二,

您应该使用!$record->isEmpty()$record->isNotEmpty(),而不是!empty($record)

第三,

您遇到的null 值可能是left join 的结果。如果您想避免使用 null 值,请使用 (inner) join

【讨论】:

    【解决方案2】:

    您在这里使用左连接 - fertilappusers 左连接 fertilapp 它会返回所有用户记录,即使他们在 fertilapp 表中没有记录。

    您提供的查询不同。第一个就像我上面说的。 第二个是 fertilapp left join fertilappusers,即使没有用户,它也会为您提供 fertilapp 的所有记录。

    请查看此链接,您将熟悉 mysql join 的工作原理 What's the difference between INNER JOIN, LEFT JOIN, RIGHT JOIN and FULL JOIN?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      相关资源
      最近更新 更多