Использование if в ActiveRecord

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
alex2017
Сообщения: 12
Зарегистрирован: 2017.08.08, 21:39

Использование if в ActiveRecord

Сообщение alex2017 »

Всем привет!
Хочу написать метод в котором будет один не обязательный параметр. Получается вот такой код:

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

public static function findDepartment($name, $sname, $faculty_id = null)
    {
        $department = self::find()
            ->andWhere(['ilike', 'name', trim($name)])
            ->andWhere(['ilike', 'sname', trim($sname)]);
        if (!is_null($faculty_id)) {
            $department->andWhere(['=', 'faculty_id', $faculty_id]);
        }
        $department->one();
        return $department;
    }
    
Если использовать данную конструкцию то sql формируется правильно,

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

"SELECT * FROM "department" WHERE ("name" ILIKE '%Горное дело%') AND ("sname" ILIKE '%ГД%')"
Но возвращается почему-то NULL.
Если убрать if и задать значение для faculty_id или же совсем убрать этот andWhere, то все работает правильно.
Как быть в этой ситуации.
Спасибо1
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Использование if в ActiveRecord

Сообщение unknownby »

А если поменять null на 0?
Задать условие $faculty_id > 0
И прописать в условии

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

$department->andWhere(['faculty_id' => $faculty_id]);
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Использование if в ActiveRecord

Сообщение maleks »

посмотрите andFilterWhere
Yii2 universal module sceleton - for basic and advanced templates
alex2017
Сообщения: 12
Зарегистрирован: 2017.08.08, 21:39

Re: Использование if в ActiveRecord

Сообщение alex2017 »

Вышел из ситуации следующим образом. Я так понял что if будет работать только в ActiveDataProvider. В обычных запросах он не будет работать корректно.

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

public static function findDepartment($name, $sname, $faculty_id = null)
    {
        if (!is_null($faculty_id)) {
            $department = self::find()
                ->andWhere(['ilike', 'name', trim($name)])
                ->andWhere(['ilike', 'sname', trim($sname)])
                ->andWhere(['faculty_id' => $faculty_id])
                ->one();
        } else {
            $department = self::find()
                ->andWhere(['ilike', 'name', trim($name)])
                ->andWhere(['ilike', 'sname', trim($sname)])
                ->one();
        }
        return $department;
    }
alex2017
Сообщения: 12
Зарегистрирован: 2017.08.08, 21:39

Re: Использование if в ActiveRecord

Сообщение alex2017 »

Спасибо не помогло
unknownby писал(а): 2020.10.17, 20:26 А если поменять null на 0?
Задать условие $faculty_id > 0
И прописать в условии

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

$department->andWhere(['faculty_id' => $faculty_id]);
alex2017
Сообщения: 12
Зарегистрирован: 2017.08.08, 21:39

Re: Использование if в ActiveRecord

Сообщение alex2017 »

Тоже самая ошибка. Спасибо
maleks писал(а): 2020.10.18, 06:32 посмотрите andFilterWhere
Ответить