在Yii2中,我们使用
获得related modelsclass AnyClass {
...
public function getUser()
{
return $this->hasOne(User::className(), ['id' => 'user_id']);
}
}
这种实施有什么不同?
class AnyClass {
...
public function getUser()
{
return User::find()->where(['id' => $this->user_id]);
}
}
我打算使用多个复合键,并认为第二个版本更容易扩展复合键的附加条件。
答案 0 :(得分:8)
您可以在关系中添加复合键或额外条件:
public function getUser() {
return $this->hasOne(User::className(), ['id' => 'user_id'])
->onCondition(['user.status' => 'active'])
}
public function getAdultUser() {
return $this->getUser()->where(['user.adult' => 1])
}
另请注意,当您通过getter方法调用实际相关记录时会加载:
$anyClass->user
将返回用户。$anyClass->getUser()
将返回 ActiveQuery 对象。因此,您可以随时随地添加额外条件:
$anyClass->getUser()->where(['>', 'user.created_at', strtotime("previous month")])
您的实现并不代表两个对象之间的实际关系。对于延迟加载数据仅 AND IF AnyClass
是加载的记录:AnyClass::findOne(1)->user
。
管理聚合数据或多个结果集的唯一方法是使用 hasOne 或 hasMany ,并指定您之间的逻辑关系,其中延迟加载是不切实际的表格(在这种情况下['id' => 'user_id']
指的是AnyClass
和User
之间的严格关系。
AnyClass::find()->with(`user`)->limit(1000);
AnyClass::find()->joinWith(`user`);
SomeOtherClass::find()->joinWith('anyClass.user')->where('user.is_valid');