CakePHP 3.x - toArray () в ноль - PullRequest
       32

CakePHP 3.x - toArray () в ноль

0 голосов
/ 16 октября 2018

В методе контроллера я пытаюсь получить последнюю запись в таблице истории комментариев ревизии.

Итак, у меня есть это:

$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 не нужна?

1 Ответ

0 голосов
/ 16 октября 2018

Вызов ->first() вернет только один объект или ноль, если его нет.->toArray() преобразует объект в массив, если это то, что вам нужно, но вы не можете вызывать функцию с нулевым значением, следовательно, ваша ошибка.

Если вы хотите, чтобы массив возвращался непосредственно из ->first() вызов, вы могли бы использовать ->hydrate(false) ранее в запросе, а затем пропустить вызов ->array().

Вы также можете использовать ->firstOrFail() и перехватить полученное исключение, когда нет соответствующих записей;это примерно эквивалентно вашему if методу, но может иметь преимущества в некоторых случаях.

...