Ни то ни другое
Ок, распишу как можно подробнее. Допустим у нас есть модель "юзер", у юзера есть такие свойства как аватар, страна, город и дата рождения. Страна и город представлены внешними отношенями. Таким образом модель у нас получается примерно такая:
Код: Выделить всё
class User extends CActiveRecord
{
...
public function relations()
{
return array(
'country'=> array(self::BELONGS_TO, 'Country', 'user_country'),
'city' => array(self::BELONGS_TO, 'City', 'user_city'),
);
}
...
}
Значения свойств "аватар" и "дата рождения" требуют некоторых преобразований. Для этого мы делаем отдельную функцию, которая обрабатывает нам данные модели и возвращает готовый массив данных для представления. Функция может выглядить как-то так:
Код: Выделить всё
function prepareUserData($userModel)
{
$data = array();
$data['avatar'] = '/images/'.$userModel->avatar;
$data['country'] = $data['city'] = '';
$data['age'] = some_age_calc_func($userModel->birthdate);
if (isset($userModel->country)) // вот тут мы проверяем отношение, нам нужно просто знать есть данные или нет, если есть - хорошо, нету - бог с ними, запрос к БД при этом не нужен совсем
{
$data['country'] = $userModel->country->name;
}
if (isset($userModel->city)) // аналогично
{
$data['city'] = $userModel->city->name;
}
}
Этой функции отдаются данные модели в разных участках приложения и только в некоторых местах необходимы данные о стране и городе, но делать 2 отдельные функции излишне, поэтому во всех нужных местах используем эту функцию, с той лишь разницей, что где-то мы до этого получаем модель вместе с отношениями (with(...)), а где-то нам нужен только аватар, например, поэтому мы делаем запрос без with - и вот в этом месте и проблема, ибо Yii все равно делает запрос к БД.
Разжую. Допустим есть страница нашего юзера, тогда мы показываем ее как-то так.
Контроллер:
Код: Выделить всё
public function actionShowUser($id)
{
$user = User::model()->with('country', 'city')->findByPk($id);
$this->render('show', array('user'=>prepareUserData($user));
}
В представлении мы уже можем оперировать данными нашего массива:
До сих пор все отлично. А дальше у нас есть страница, где нам нужно вывести только аватары и возраст в альте. Соответственно в контроллере мы пишем так:
Код: Выделить всё
public function actionShowAllUsers()
{
$users = User::model()->findAll(); // нам НЕ нужны страна и город
$usersData = array();
foreach ($users as $user)
{
$usersData[] = prepareUserData($user); // наша функция, и вот тут-то у нас в цикле Yii зарядит отложенную загрузку
}
$this->render('all', array('users'=>$usersData);
}
В представлении все как обычно:
Код: Выделить всё
foreach ($users as $user)
{
echo '<img src="'.$user['avatar'].'" alt="'.$user['age'].'" />';
}
Так понятно что я пытаюсь сказать? Пример немного надуман, поэтому не нужно предлагать его решать по-другому, он такой просто для наглядности.
Если я непосредственно пытаюсь использовать отношение ($user->city->name), то отложенная загрузка логична и уместна (используется __get()). Если же мне просто нужно знать были забраны данные или нет (isset($user->city), используем __isset()), то на кой черт делать обращение к БД?