与一个主键的两个外键的关系

时间:2018-06-03 13:20:06

标签: 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']);
}

我必须做

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

一切正常。但是可以以某种方式更好地完成这些关系(实现)吗?

1 个答案:

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