gpt4 book ai didi

database - Yii2 - 有一个替代方案

转载 作者:搜寻专家 更新时间:2023-10-30 21:41:16 25 4
gpt4 key购买 nike

在 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]);
}
}

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

最佳答案

您可以在关系本身中添加复合键或额外条件:

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 将返回 User 的实例。
  • $anyClass->getUser() 将返回 ActiveQuery 对象。

因此您可以在需要的时间和地点添加额外的条件:

$anyClass->getUser()->where(['>', 'user.created_at', strtotime("previous month")])

您的实现并不代表两个对象之间的实际关系。它将用于延迟加载数据并且如果 AnyClass 是加载的记录:AnyClass::findOne(1)->用户

在延迟加载不切实际的情况下,管理聚合数据或多个结果集的唯一方法是使用 hasOnehasMany,并指定您的数据之间的逻辑关系表(在这种情况下 ['id' => 'user_id'] 指的是 AnyClassUser 之间的严格关系)。

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

关于database - Yii2 - 有一个替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49969321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com