在控制器方法中,我试图获取修订注释历史记录表中的最新记录。
所以我有这个:
$RevisionSubstances = TableRegistry::get('RevisionSubstances');
$revision_history = $RevisionSubstances->find('all')->where(['substance_id' => $substance_id])->orderDesc('date')->first()-toArray();
debug($revision_history);
这很好-只要'revision_substances'
表中有符合条件的记录即可。
我注意到,对于没有找到匹配数据的查询(即数据库中没有与查询匹配的记录),这会给我一个错误:
在数组上调用成员函数
toArray()
我的解决方法是从查询中删除toArray()
。然后,我使用if
语句在对其调用$revision_history
之前检查null
是否不是toArray()
,如下所示:
$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
,应用程序不会产生致命错误。
这是处理这种情况的正确/最佳方法,还是有更优雅的方法?我觉得不必if
声明是不必要的吗?
答案 0 :(得分:2)
对wget -q -O- "http://meteocentre.com/montreal/home_e.html" | grep -oP '(?<=Tn= ).*(?=°)' | echo $(cat) °C
的调用将仅返回一个对象,如果没有则返回null。 ->first()
会将对象转换为数组,如果需要的话,但是您不能在空值上调用函数,因此会出错。
如果您希望直接从->toArray()
调用中返回一个数组,则可以在查询的前面使用->first()
,然后跳过->hydrate(false)
调用。
如果没有匹配的记录,您也可以使用->array()
并捕获结果异常;这大约相当于您的->firstOrFail()
方法,但是在某些情况下可能会有好处。