Как сравнить значения из объединенных таблиц в Yii2 ActiveDataProvider

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
leonenco
Сообщения: 155
Зарегистрирован: 2017.01.30, 22:42

Как сравнить значения из объединенных таблиц в Yii2 ActiveDataProvider

Сообщение leonenco »

Я пытаюсь вывести поиск для виджета gridview. Проблема в том, что мне нужно сравнить значения из основной таблицы и из объединенной таблицы. Проблема в том что 'rank.promotion_points' выводит как строку, а не как связь со значением.

Вот из дебага:

Код: Выделить всё

SELECT user.* FROM user LEFT JOIN rank ON user.rank_id = rank.id WHERE (rank_id NOT IN (1, 2, 3, 4, 5, 6)) AND (user.rank_points >= 'rank.promotion_points') LIMIT 20 <-----rкак видите связь в ковычках.
Как мне это побороть?

Код: Выделить всё

$query->andFilterWhere(['>=', 'user.rank_points', 'rank.promotion_points']);
Вот мой запрос который работает:

Код: Выделить всё

SELECT `user`.*
FROM `user`
LEFT JOIN `rank`
ON `user`.`rank_id` = `rank`.`id`
WHERE (`rank_id` NOT IN (1, 2, 3, 4, 5, 6))
AND (`user`.`rank_points` >= 'rank.promotion_points')
Вот мой метод:

Код: Выделить всё

public function search($params)
{
    $query = User::find();
    $query->joinWith(['rank']);

    // add conditions that should always apply here

    $dataProvider = new ActiveDataProvider([
        'query' => $query,
    ]);

    $this->load($params);

    if (!$this->validate()) {
        // uncomment the following line if you do not want to return any records when validation fails
        // $query->where('0=1');
        return $dataProvider;
    }

    // grid filtering conditions
    $query->andFilterWhere([
        'id' => $this->id,
        'rank_id' => $this->rank_id,
        'created_at' => $this->created_at,
        'updated_at' => $this->updated_at,
    ]);

    $query->andFilterWhere(['like', 'username', $this->username]);
    $query->andFilterWhere(['not in', 'rank_id', [1, 2, 3, 4, 5, 6]]);
    $query->andFilterWhere(['>=', 'user.rank_points', 'rank.promotion_points']);

    return $dataProvider;
rank table schema:

Код: Выделить всё

+------------------+--------------+------+-----+---------+----------------+
| Field            | Type         | Null | Key | Default | Extra          |
+------------------+--------------+------+-----+---------+----------------+
| id               | int(11)      | NO   | PRI | NULL    | auto_increment |
| name             | varchar(255) | NO   | UNI | NULL    |                |
| rank_points      | int(11)      | YES  |     | NULL    |                |
| promotion_points | int(11)      | YES  |     | NULL    |                |
+------------------+--------------+------+-----+---------+----------------+
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как сравнить значения из объединенных таблиц в Yii2 ActiveDataProvider

Сообщение ElisDN »

Код: Выделить всё

$query->andFilterWhere(['>=', 'user.rank_points', new Expression('rank.promotion_points')])
Ответить