Отношения с двумя внешними ключами к одному первичному ключу - PullRequest
0 голосов
/ 03 июня 2018

У меня есть таблица с отношениями двух внешних ключей к одному первичному:

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 голосов
/ 03 июня 2018

Это отдельные отношения, вы не можете объявить это по-другому (по крайней мере, не взломав 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...