CakePHP 3.x - toArray() 为空
CakePHP 3.x - toArray() on null
在控制器方法中,我正在尝试获取 table 修订评论历史记录中的最新记录。
所以我有这个:
$RevisionSubstances = TableRegistry::get('RevisionSubstances');
$revision_history = $RevisionSubstances->find('all')->where(['substance_id' => $substance_id])->orderDesc('date')->first()-toArray();
debug($revision_history);
这很好用 - 只要 'revision_substances'
table 中有符合条件的记录。
我注意到对于没有找到匹配数据的查询(即数据库中不存在与查询匹配的记录),它给我一个错误:
Call to a member function toArray()
on array
我的解决方法是从查询中删除 toArray()
。然后我在调用 toArray()
之前使用 if
语句检查 $revision_history
是否不是 null
,如下所示:
$revision_history = $RevisionSubstances->find('all')->where(['substance_id' => $substance_id])->orderDesc('date')->first();
if ($revision_history) {
$revision_history = $revision_history->toArray();
}
debug($revision_history);
这有效并给了我想要的结果 - debug($revision_history);
的输出是 null
并且应用程序没有生成致命错误。
这是处理这种情况的 correct/best 方法还是有更优雅的方法?我觉得必须有一个 if
声明在某种程度上是不必要的?
对 ->first()
的调用将 return 只有一个对象,如果有 none,则为 null。 ->toArray()
会将对象转换为数组,如果这是你想要的,但你不能在空值上调用函数,因此你的错误。
如果您想要一个数组 return 直接从 ->first()
调用中编辑,您可以在查询的前面使用 ->hydrate(false)
,然后跳过 ->array()
调用。
您也可以使用 ->firstOrFail()
并在没有匹配记录时捕获由此产生的异常;这大约相当于您的 if
方法,但在某些情况下可能会有好处。
在控制器方法中,我正在尝试获取 table 修订评论历史记录中的最新记录。
所以我有这个:
$RevisionSubstances = TableRegistry::get('RevisionSubstances');
$revision_history = $RevisionSubstances->find('all')->where(['substance_id' => $substance_id])->orderDesc('date')->first()-toArray();
debug($revision_history);
这很好用 - 只要 'revision_substances'
table 中有符合条件的记录。
我注意到对于没有找到匹配数据的查询(即数据库中不存在与查询匹配的记录),它给我一个错误:
Call to a member function
toArray()
on array
我的解决方法是从查询中删除 toArray()
。然后我在调用 toArray()
之前使用 if
语句检查 $revision_history
是否不是 null
,如下所示:
$revision_history = $RevisionSubstances->find('all')->where(['substance_id' => $substance_id])->orderDesc('date')->first();
if ($revision_history) {
$revision_history = $revision_history->toArray();
}
debug($revision_history);
这有效并给了我想要的结果 - debug($revision_history);
的输出是 null
并且应用程序没有生成致命错误。
这是处理这种情况的 correct/best 方法还是有更优雅的方法?我觉得必须有一个 if
声明在某种程度上是不必要的?
对 ->first()
的调用将 return 只有一个对象,如果有 none,则为 null。 ->toArray()
会将对象转换为数组,如果这是你想要的,但你不能在空值上调用函数,因此你的错误。
如果您想要一个数组 return 直接从 ->first()
调用中编辑,您可以在查询的前面使用 ->hydrate(false)
,然后跳过 ->array()
调用。
您也可以使用 ->firstOrFail()
并在没有匹配记录时捕获由此产生的异常;这大约相当于您的 if
方法,但在某些情况下可能会有好处。