Страница 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 и я пытаюсь использовать это свойство то в базу шлется странный запрос:
Заметил это в логах, потом еще перепроверил: $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
Разве это не то что и требуется?
Re: Where 0=1
Добавлено: 2018.08.02, 08:09
Brainfuck
maleks писал(а): ↑2018.08.02, 07:56
Разве это не то что и требуется?
Мне требуется чтобы не посылался запрос.
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
Хмм. Печально что они не хотят это править... Ну чтож, выходит остается смириться...
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
Можете сами исправить и сделать пулл реквест.
Ну простейший вариант для вас, пока это не исправят, обернуть вызов в:
Re: Where 0=1
Добавлено: 2018.08.02, 12:36
Brainfuck
andku83 писал(а): ↑2018.08.02, 12:33
Можете сами исправить и сделать пулл реквест.
Ну простейший вариант для вас, пока это не исправят, обернуть вызов в:
Выше кидали ссылку где они сказали что не хотят это исправлять. И такое поведение не единичный случай чтобы прописывать проверку в каждой связи.
Re: Where 0=1
Добавлено: 2018.08.02, 13:20
andku83
критичными местами являются единичные случаи, везде оно не сильно повлияет на производительность.