0

我有一些具有外键引用的表:

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

4

1 回答 1

1

当您执行类似的操作时$model->Tech->TechSchedule[0]->Location->Customer,您会看到 PHP 会针对您尝试访问的每个关系向数据库发送一个查询。在您的情况下,这可能相当于发送到数据库的 4 个不同的数据库查询。在许多情况下,您希望减少 PHP 查询数据库的次数,因为它非常昂贵(时间方面)。

如果您执行类似的操作User::model()->with('...'),所有这些关系都将与 User 模型结合在一起。如果您知道您将访问相关数据(较少往返数据库),这可能会节省您的时间,但如果您只想访问 User 表中的数据,则可能会带来不必要的数据。

更多信息在这里(官方文档)

于 2015-01-07T19:22:20.747 回答