我有一个表,关系是一个主要的两个外键:
public function getFromUser()
{
return $this->hasOne(User::className(), ['id' => 'from_user_id']);
}
public function getToUser()
{
return $this->hasOne(User::className(), ['id' => 'to_user_id']);
}
我必须做
$var = Posts::find()->select([
...
])->with([
'fromUser' => function (yii\db\ActiveQuery $query) {
$query->select(['id', 'concat(...) AS name']);
},
'toUser' => function (yii\db\ActiveQuery $query) {
$query->select(['id', 'concat(...) AS name']);
}
])->asArray()->all();
一切正常。但是可以以某种方式更好地完成这些关系(实现)吗?
答案 0 :(得分:0)
这些是单独的关系,你不能以不同的方式声明它(至少不是没有黑客ActiveRecord
关系逻辑)。如果这些是“双胞胎”关系并且您不想重复两次相同的事情,您可以编写帮助器方法,这两种方法将对两种关系执行相同的操作。
例如ActiveQuery
型号的自定义Post
:
class PostQuery extends ActiveQuery {
public function withUsers(?Closure $callback = null) {
if ($callback === null) {
return $this->with(['fromUser', 'toUser']);
}
return $this->with([
'fromUser' => $callback,
'toUser' => $callback,
]);
}
}
class Post extends ActiveRecord {
// ...
/**
* @return PostQuery
*/
public static function find() {
return Yii::createObject(PostQuery::class, [static::class]);
}
}
然后使用withUsers()
方法将条件应用于两种关系:
$var = Post::find()
->select([
// ...
])
->withUsers(function (yii\db\ActiveQuery $query) {
$query->select(['id', 'concat(...) AS name']);
})
->asArray()
->all();
或者:
$var = Post::find()->withUsers()->all();