Activerecord 与两个外键到一个主键的关系
我有一个表,其中包含两个外键对一个主键的关系:Activerecord 与两个外键到一个主键的关系,activerecord,yii2,Activerecord,Yii2,我有一个表,其中包含两个外键对一个主键的关系: public function getFromUser() { return $this->hasOne(User::className(), ['id' => 'from_user_id']); } public function getToUser() { return $this->hasOne(User::className(), ['id' => 'to_user_id']); } 我必须这么做
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();
一切都很好。但是,是否可以以某种方式更好地实现这些关系?这些是独立的关系,您不能以不同的方式声明它(至少在没有hack
ActiveRecord
关系逻辑的情况下是如此)。如果这些是“孪生”关系,并且您不想重复相同的事情两次,那么您可以编写helpers方法,对这两个关系执行相同的操作
例如,针对Post
模型的自定义ActiveQuery
:
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();
或:
定义“更好”。@rob006已定义
$var = Post::find()->withUsers()->all();