Я рекомендую вам всегда проверять, возвращает ли отношение null
или empty array
.
Следующий код хорошо работает с типами отношений HAS_ONE
и BELONGS_TO
:
$cinema = Cinema::model()->find(); // get a cinema instance, assuming there is at least one row in the database.
$city = $cinema->city; // get the relation
if ($city !== null) {
// $city is a valid model
} else {
// $city is null, the corresponding row does not exist in the database
}
Вы также можете выполнить эту проверку без использования новой переменной (в данном случае, $city
):
if ($cinema->city!==null) {
// the relation is available
}
Проверка, не возвращает ли отношение null
, - лучший способ избежать ошибки PHP «попытка получить свойство необъекта». Также, если вы застряли с подобными ошибками, рекомендуется использовать такие функции, как var_dump()
или, что еще лучше, отладчик.
Также обратите внимание, что ключи массива в массиве, возвращаемые функцией relations()
, - это свойство, к которому необходимо получить доступ, чтобы получить реляционные модели:
public function relations() {
return array(
'city' => array( ... ),
// city is the property that has to be accessed
// Yii's conventions recommend to use 'city_id' for the foreign key column name
);
}
Также обратите внимание, что хорошо следовать соглашениям Yii для именования отношений и столбцов, чтобы избежать использования одного и того же имени для свойства и отношений - в этом случае отношение будет недоступно и, вероятно, будет ошибкой типа «попытки доступа». свойство необъекта "появится при игре с отношением.
Последнее, при работе с отношениями HAS_MANY
или MANY_TO_MANY
, отношение возвращает массив моделей, даже если доступна только одна модель, и пустой массив, если ничего не доступно.
Объяснение в документах:
http://www.yiiframework.com/doc/guide/1.1/en/database.arr#performing-relational-query