Where 0=1

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Where 0=1

Сообщение 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.
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: Where 0=1

Сообщение 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. Похоже на баг...
Последний раз редактировалось Brainfuck 2018.08.01, 17:19, всего редактировалось 1 раз.
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: Where 0=1

Сообщение yan »

версия фреймворка какая?
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: Where 0=1

Сообщение Brainfuck »

yan писал(а): 2018.08.01, 17:18 версия фреймворка какая?
2.0.15.1
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Where 0=1

Сообщение maleks »

Brainfuck писал(а): 2018.08.01, 16:38 Статья может входить в одну секцию, а может и не входить (section_id = null). Так вот когда section_id не null все ок - свойство section работает отлично, но когда он null и я пытаюсь использовать это свойство то в базу шлется странный запрос:
Чему в этом случае section равно?
Yii2 universal module sceleton - for basic and advanced templates
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: Where 0=1

Сообщение Brainfuck »

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

Re: Where 0=1

Сообщение maleks »

Brainfuck писал(а): 2018.08.02, 07:25 null
Разве это не то что и требуется?
Yii2 universal module sceleton - for basic and advanced templates
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: Where 0=1

Сообщение Brainfuck »

maleks писал(а): 2018.08.02, 07:56
Brainfuck писал(а): 2018.08.02, 07:25 null
Разве это не то что и требуется?
Мне требуется чтобы не посылался запрос.
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Where 0=1

Сообщение yiijeka »

Ну а код где ?
> Статья может входить в одну секцию, а может и не входить (section_id = null).
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: Where 0=1

Сообщение Brainfuck »

yiijeka писал(а): 2018.08.02, 08:24 Ну а код где ?
> Статья может входить в одну секцию, а может и не входить (section_id = null).
Код в первом посте.
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Where 0=1

Сообщение maleks »

Brainfuck писал(а): 2018.08.02, 08:09 Мне требуется чтобы не посылался запрос.
https://github.com/yiisoft/yii2/issues/4774
Yii2 universal module sceleton - for basic and advanced templates
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: Where 0=1

Сообщение Brainfuck »

maleks писал(а): 2018.08.02, 10:54
Brainfuck писал(а): 2018.08.02, 08:09 Мне требуется чтобы не посылался запрос.
https://github.com/yiisoft/yii2/issues/4774
Хмм. Печально что они не хотят это править... Ну чтож, выходит остается смириться...
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Where 0=1

Сообщение andku83 »

Brainfuck писал(а): 2018.08.02, 08:29 Код в первом посте.
где код которым вы запрашиваете данные? (тот который вызывает этот запрос)
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: Where 0=1

Сообщение Brainfuck »

andku83 писал(а): 2018.08.02, 12:25
Brainfuck писал(а): 2018.08.02, 08:29 Код в первом посте.
где код которым вы запрашиваете данные? (тот который вызывает этот запрос)
Brainfuck писал(а): 2018.08.01, 16:38 $article->getSection()->createCommand()->rawSql
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Where 0=1

Сообщение andku83 »

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

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

if ($article->section_id) {
    ...
}
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: Where 0=1

Сообщение Brainfuck »

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

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

if ($article->section_id) {
    ...
}
Выше кидали ссылку где они сказали что не хотят это исправлять. И такое поведение не единичный случай чтобы прописывать проверку в каждой связи.
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Where 0=1

Сообщение andku83 »

критичными местами являются единичные случаи, везде оно не сильно повлияет на производительность.
Ответить