У меня есть несколько таблиц, которые имеют ссылки на внешние ключи:
User
-> Tech
-> TechSchedule
-> Location
-> Customer
Кажется, что я могу использовать следующий запрос один раз, чтобы получить любые связанные данные для пользователя. Рассмотрим следующий запрос:
// load the user model
$model = User::model()->findByPk( Yii::app()->user->id );
// print
echo "<pre>", print_r( $model->attributes ), "</pre>";
// print more about the user
echo "<pre>", print_r( $model->Tech->TechSchedule[0]->Location->Customer ), "</pre>";
Распечатывает
Array
(
[user_id] => 1
[username] => someusername
[password] => somepassword
[salt] => somesalt
)
Customer Object
(
[_new:CActiveRecord:private] =>
[_attributes:CActiveRecord:private] => Array
(
[customer_id] => 14
[more customer data...]
)
[_related:CActiveRecord:private] => Array
(
)
[_c:CActiveRecord:private] =>
[_pk:CActiveRecord:private] => 14
[_alias:CActiveRecord:private] => t
[_errors:CModel:private] => Array
(
)
[_validators:CModel:private] =>
[_scenario:CModel:private] => update
[_e:CComponent:private] =>
[_m:CComponent:private] =>
)`
Это нормальное поведение? Если это так, какова будет цель преодоления трудностей написания реляционных запросов, таких как
$model = User::model()->with('Tech.TechSchedule.Location.Customer')->findByPk( Yii::app()->user->id );
Когда вы делаете что-то вроде $model->Tech->TechSchedule[0]->Location->Customer
, вы увидите, что PHP отправит запрос в базу данных для каждый отношение, к которому вы пытаетесь получить доступ. В вашем случае это, вероятно, составит 4 разных запроса к базе данных, отправленных в базу данных. Во многих случаях вы хотите уменьшить количество запросов PHP к базе данных, потому что это очень дорого (по времени).
Если вы делаете что-то вроде User::model()->with('...')
все эти отношения будут приведены вместе с моделью пользователя. Это может сэкономить ваше время, если вы знать вы получите доступ к этим связанным данным (меньше обращений к БД), но вы можете принести ненужные данные, если вы просто хотите получить доступ к данным в таблице User.
Дополнительная информация здесь (официальные документы)
Других решений пока нет …