Where 0=1

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

Where 0=1

Сообщение Brainfuck » 2018.08.01, 16:38

Есть такая моделька:

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

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

Re: Where 0=1

Сообщение Brainfuck » 2018.08.01, 17:16

Долго дебажил, но нашел: \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 » 2018.08.01, 17:18

версия фреймворка какая?

Brainfuck
Сообщения: 249
Зарегистрирован: 2018.02.19, 14:20

Re: Where 0=1

Сообщение Brainfuck » 2018.08.01, 17:20

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

Аватара пользователя
maleks
Сообщения: 1764
Зарегистрирован: 2012.12.26, 12:56

Re: Where 0=1

Сообщение maleks » 2018.08.02, 06:27

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

Brainfuck
Сообщения: 249
Зарегистрирован: 2018.02.19, 14:20

Re: Where 0=1

Сообщение Brainfuck » 2018.08.02, 07:25

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

Аватара пользователя
maleks
Сообщения: 1764
Зарегистрирован: 2012.12.26, 12:56

Re: Where 0=1

Сообщение maleks » 2018.08.02, 07:56

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

Brainfuck
Сообщения: 249
Зарегистрирован: 2018.02.19, 14:20

Re: Where 0=1

Сообщение Brainfuck » 2018.08.02, 08:09

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

Аватара пользователя
yiijeka
Сообщения: 3060
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Where 0=1

Сообщение yiijeka » 2018.08.02, 08:24

Ну а код где ?
> Статья может входить в одну секцию, а может и не входить (section_id = null).

Brainfuck
Сообщения: 249
Зарегистрирован: 2018.02.19, 14:20

Re: Where 0=1

Сообщение Brainfuck » 2018.08.02, 08:29

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

Аватара пользователя
maleks
Сообщения: 1764
Зарегистрирован: 2012.12.26, 12:56

Re: Where 0=1

Сообщение maleks » 2018.08.02, 10:54

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

Brainfuck
Сообщения: 249
Зарегистрирован: 2018.02.19, 14:20

Re: Where 0=1

Сообщение Brainfuck » 2018.08.02, 11:01

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 » 2018.08.02, 12:25

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

Brainfuck
Сообщения: 249
Зарегистрирован: 2018.02.19, 14:20

Re: Where 0=1

Сообщение Brainfuck » 2018.08.02, 12:28

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 » 2018.08.02, 12:33

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

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

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

Brainfuck
Сообщения: 249
Зарегистрирован: 2018.02.19, 14:20

Re: Where 0=1

Сообщение Brainfuck » 2018.08.02, 12:36

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

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

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

andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Where 0=1

Сообщение andku83 » 2018.08.02, 13:20

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

Ответить