Yii2 - hasOne替代品

时间:2018-04-22 18:25:54

标签: database activerecord yii2

在Yii2中,我们使用

获得related models
class 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]);
    }
}

我打算使用多个复合键,并认为第二个版本更容易扩展复合键的附加条件。

1 个答案:

答案 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']指的是AnyClassUser之间的严格关系。

AnyClass::find()->with(`user`)->limit(1000); 
AnyClass::find()->joinWith(`user`);
SomeOtherClass::find()->joinWith('anyClass.user')->where('user.is_valid');