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();