Страница 1 из 1

Where 0=1

Добавлено: 2018.08.01, 16:38
Brainfuck
Есть такая моделька:

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

/**
 * @property integer $id
 * @property integer $section_id
 * @property string $name
 *
 * @property-read Section $section
 */
class Article extends ActiveRecord {
    public static function tableName() {
        return '{{%articles}}';
    }
	
    public function getSection() {
        return $this->hasOne(Section::class, ['id' => 'section_id']);
    }
}

/**
 * @property integer $id
 * @property string $name
 *
 * @property-read Article[] $articles
 */
class Section extends ActiveRecord {
    public static function tableName() {
        return '{{%sections}}';
    }

    public function getArticles(): ActiveQuery {
        return $this->hasMany(Article::class, ['section_id' => 'id'])->inverseOf('section');
    }
}
Статья может входить в одну секцию, а может и не входить (section_id = null). Так вот когда section_id не null все ок - свойство section работает отлично, но когда он null и я пытаюсь использовать это свойство то в базу шлется странный запрос:

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

SELECT * FROM `sections` WHERE 0=1
Заметил это в логах, потом еще перепроверил: $article->getSection()->createCommand()->rawSql

Подскажите почему так происходит? Ну во первых правильный запрос уж тогда должен быть:

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

SELECT * FROM `sections` WHERE `id` is null
А во вторых логично было бы чтобы запрос вообще не слался если section_id = null.

Re: Where 0=1

Добавлено: 2018.08.01, 17:16
Brainfuck
Долго дебажил, но нашел: \yii\db\conditions\InConditionBuilder 61 строка. Выглядит это место так:

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

$sqlValues = $this->buildValues($expression, $values, $params);
if (empty($sqlValues)) {
	return $operator === 'IN' ? '0=1' : '';
}
Соответственно $sqlValues выходит пустой, т.к. и $values пустой (значения оператора in - там же null было). И он возвращает этот самый 0=1. Похоже на баг...

Re: Where 0=1

Добавлено: 2018.08.01, 17:18
yan
версия фреймворка какая?

Re: Where 0=1

Добавлено: 2018.08.01, 17:20
Brainfuck
yan писал(а): 2018.08.01, 17:18 версия фреймворка какая?
2.0.15.1

Re: Where 0=1

Добавлено: 2018.08.02, 06:27
maleks
Brainfuck писал(а): 2018.08.01, 16:38 Статья может входить в одну секцию, а может и не входить (section_id = null). Так вот когда section_id не null все ок - свойство section работает отлично, но когда он null и я пытаюсь использовать это свойство то в базу шлется странный запрос:
Чему в этом случае section равно?

Re: Where 0=1

Добавлено: 2018.08.02, 07:25
Brainfuck
maleks писал(а): 2018.08.02, 06:27
Brainfuck писал(а): 2018.08.01, 16:38 Статья может входить в одну секцию, а может и не входить (section_id = null). Так вот когда section_id не null все ок - свойство section работает отлично, но когда он null и я пытаюсь использовать это свойство то в базу шлется странный запрос:
Чему в этом случае section равно?
null

Re: Where 0=1

Добавлено: 2018.08.02, 07:56
maleks
Brainfuck писал(а): 2018.08.02, 07:25 null
Разве это не то что и требуется?

Re: Where 0=1

Добавлено: 2018.08.02, 08:09
Brainfuck
maleks писал(а): 2018.08.02, 07:56
Brainfuck писал(а): 2018.08.02, 07:25 null
Разве это не то что и требуется?
Мне требуется чтобы не посылался запрос.

Re: Where 0=1

Добавлено: 2018.08.02, 08:24
yiijeka
Ну а код где ?
> Статья может входить в одну секцию, а может и не входить (section_id = null).

Re: Where 0=1

Добавлено: 2018.08.02, 08:29
Brainfuck
yiijeka писал(а): 2018.08.02, 08:24 Ну а код где ?
> Статья может входить в одну секцию, а может и не входить (section_id = null).
Код в первом посте.

Re: Where 0=1

Добавлено: 2018.08.02, 10:54
maleks
Brainfuck писал(а): 2018.08.02, 08:09 Мне требуется чтобы не посылался запрос.
https://github.com/yiisoft/yii2/issues/4774

Re: Where 0=1

Добавлено: 2018.08.02, 11:01
Brainfuck
maleks писал(а): 2018.08.02, 10:54
Brainfuck писал(а): 2018.08.02, 08:09 Мне требуется чтобы не посылался запрос.
https://github.com/yiisoft/yii2/issues/4774
Хмм. Печально что они не хотят это править... Ну чтож, выходит остается смириться...

Re: Where 0=1

Добавлено: 2018.08.02, 12:25
andku83
Brainfuck писал(а): 2018.08.02, 08:29 Код в первом посте.
где код которым вы запрашиваете данные? (тот который вызывает этот запрос)

Re: Where 0=1

Добавлено: 2018.08.02, 12:28
Brainfuck
andku83 писал(а): 2018.08.02, 12:25
Brainfuck писал(а): 2018.08.02, 08:29 Код в первом посте.
где код которым вы запрашиваете данные? (тот который вызывает этот запрос)
Brainfuck писал(а): 2018.08.01, 16:38 $article->getSection()->createCommand()->rawSql

Re: Where 0=1

Добавлено: 2018.08.02, 12:33
andku83
Можете сами исправить и сделать пулл реквест.
Ну простейший вариант для вас, пока это не исправят, обернуть вызов в:

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

if ($article->section_id) {
    ...
}

Re: Where 0=1

Добавлено: 2018.08.02, 12:36
Brainfuck
andku83 писал(а): 2018.08.02, 12:33 Можете сами исправить и сделать пулл реквест.
Ну простейший вариант для вас, пока это не исправят, обернуть вызов в:

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

if ($article->section_id) {
    ...
}
Выше кидали ссылку где они сказали что не хотят это исправлять. И такое поведение не единичный случай чтобы прописывать проверку в каждой связи.

Re: Where 0=1

Добавлено: 2018.08.02, 13:20
andku83
критичными местами являются единичные случаи, везде оно не сильно повлияет на производительность.