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 方法,但在某些情况下可能会有好处。