Yii и реляционные запросы

0

У меня есть несколько таблиц, имеющих ссылки на внешние ключи:

UserTechTechScheduleLocationCustomer

Кажется, что я могу использовать следующий запрос один раз, чтобы получить какие-либо связанные данные с пользователем. Рассмотрим следующий запрос:

// 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 );

Теги:
yii

1 ответ

1
Лучший ответ

Когда вы сделаете что-то вроде $model->Tech->TechSchedule[0]->Location->Customer, вы увидите, что PHP отправит запрос в базу данных для каждого отношения, к которому вы пытаетесь получить доступ. В вашем случае это, вероятно, составит 4 разных запроса БД, отправленных в базу данных. Во многих случаях вы хотите уменьшить количество запросов PHP к базе данных, потому что это очень дорого (по времени).

Если вы сделаете что-то вроде User::model()->with('...'), все эти отношения будут объединены с моделью пользователя. Это может сэкономить ваше время, если вы знаете, что получите доступ к этим связанным данным (меньше обращений к БД), но вы можете принести ненужные данные, если хотите просто получить доступ к данным в таблице User.

Дополнительная информация здесь (официальные документы)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню