Пользовательское добавление условия в sql

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

Пользовательское добавление условия в sql

Сообщение shon »

Добавил во вью селект

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

<select name="list">
    <option value="mouse">mouse</option>
    <option value="keyboard">keyboard</option>
    <option value="headphones">headphones/option>
</select>`
В модели создал

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

$list = "'mouse','keyboard','headphones'";

Как добавить условие, при котором

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

where items_sort in ({$list})
в $list, попадало бы то, что выбрал юзер, например `mouse`.?

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

$result =  Yii::$app->getDb()->createCommand(
        "Select *
         from order_table
         where items_sort in ({$list})"
    )->queryAll();


    return $result;
}
winzza
Сообщения: 126
Зарегистрирован: 2015.06.11, 20:30

Re: Пользовательское добавление условия в sql

Сообщение winzza »

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

...
$list = Yii::$app->request->post('list', 'mouse')
...
$result =  Yii::$app->getDb()->createCommand('
        Select *
         from order_table
         where items_sort in :list
    ')->bindValue(':list', '('.$list.')')
    ->queryAll();

    return $result;
}
Как то так... (Не тестил)
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Пользовательское добавление условия в sql

Сообщение Alexum »

А почему бы вам не сгенерировать в gii нормальную модель ActiveRecord для order_table, сгенерировать CRUD для неё, всё красиво выводить виджетами, где удобно вешать любые фильтры (и это не будет выглядеть как костыль). Кроме того, вы же наверняка где-то ещё работаете с отдельными записями из order_table, неужели без ActiveRecord?
shon
Сообщения: 29
Зарегистрирован: 2017.02.10, 14:13

Re: Пользовательское добавление условия в sql

Сообщение shon »

winzza писал(а): 2017.02.13, 12:45

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

...
$list = Yii::$app->request->post('list', 'mouse')
...
$result =  Yii::$app->getDb()->createCommand('
        Select *
         from order_table
         where items_sort in :list
    ')->bindValue(':list', '('.$list.')')
    ->queryAll();

    return $result;
}
Как то так... (Не тестил)
Разве это не жестко задает условием только mouse? Я имел ввиду, что в list должно попадать то,что выбрал пользователь(mouse,как пример был приведен)
shon
Сообщения: 29
Зарегистрирован: 2017.02.10, 14:13

Re: Пользовательское добавление условия в sql

Сообщение shon »

Alexum писал(а): 2017.02.13, 13:05 А почему бы вам не сгенерировать в gii нормальную модель ActiveRecord для order_table, сгенерировать CRUD для неё, всё красиво выводить виджетами, где удобно вешать любые фильтры (и это не будет выглядеть как костыль). Кроме того, вы же наверняка где-то ещё работаете с отдельными записями из order_table, неужели без ActiveRecord?
Для этой таблицы уже сгенерирована модель через gii.

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

class Order extends \yii\db\ActiveRecord
Пока не нашел, как добавить подобный "селект" средствами yii
winzza
Сообщения: 126
Зарегистрирован: 2015.06.11, 20:30

Re: Пользовательское добавление условия в sql

Сообщение winzza »

shon писал(а): 2017.02.13, 13:42
winzza писал(а): 2017.02.13, 12:45

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

...
$list = Yii::$app->request->post('list', 'mouse')
...
$result =  Yii::$app->getDb()->createCommand('
        Select *
         from order_table
         where items_sort in :list
    ')->bindValue(':list', '('.$list.')')
    ->queryAll();

    return $result;
}
Как то так... (Не тестил)
Разве это не жестко задает условием только mouse? Я имел ввиду, что в list должно попадать то,что выбрал пользователь(mouse,как пример был приведен)
По дефолту mouse если в посте list ничего не будет.
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Пользовательское добавление условия в sql

Сообщение Alexum »

По хорошему должна быть отдельная табличка с типами, которой будет рулить администратор из админки. Например, появится новый тип/подтип товара и что делать, ковырять код каждый раз? Какой-то у вас очень упрощённый вариант. Ну да ладно... Генерируете для этой модели CRUD в gii, выводится ваш список при помощи виджета GridView. Только поле items_sort лучше переименовать во что-то более логичное, н-р item_type. Чтобы был красивый множественный выбор из списка используете виджет Select2 (Small Multiple). http://demos.krajee.com/widget-details/ ... sage-sizes

Выводите колонку с типом или вешаете фильтр на любую другую колонку:

Настройка колонки в GridView:

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

[
            'attribute' => 'item_type',
            'filter' => Select2::widget([
                'model' => $searchModel,
                'attribute' => 'item_type',
                'size' => Select2::SMALL,
                'data' => ModelName::getTypesForSelect(),  // Этим методом будем вытаскивать из модели массив для заполнения select. По фен-шую массив нужно передавать из контроллера. 
                'options' => ['placeholder' => 'Фильтр...', 'multiple' => true],
                'pluginOptions' => [
                    'allowClear' => true,
                ],
            ]),
],
В search-модели

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

public function rules()
    {
        return [
        ...
        // Это самый простой вариант, лучше добавить свой метод-валидатор, который проверит, что передаваемой значение есть в массиве типов
            [['item_type'], 'each', 'rule' => ['string']],
        ];
    }   
Массив IN фреймворк сам сформирует, достаточно записи которая уже появится после генерации в gii

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

 $query->andFilterWhere([
            'item_type' => $this->item_type,
]);
Ничего сложного ;)
shon
Сообщения: 29
Зарегистрирован: 2017.02.10, 14:13

Re: Пользовательское добавление условия в sql

Сообщение shon »

Alexum писал(а): 2017.02.13, 14:21 По хорошему должна быть отдельная табличка с типами, которой будет рулить администратор из админки. Например, появится новый тип/подтип товара и что делать, ковырять код каждый раз? Какой-то у вас очень упрощённый вариант. Ну да ладно... Генерируете для этой модели CRUD в gii, выводится ваш список при помощи виджета GridView. Только поле items_sort лучше переименовать во что-то более логичное, н-р item_type. Чтобы был красивый множественный выбор из списка используете виджет Select2 (Small Multiple). http://demos.krajee.com/widget-details/ ... sage-sizes

Выводите колонку с типом или вешаете фильтр на любую другую колонку:

Настройка колонки в GridView:

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

[
            'attribute' => 'item_type',
            'filter' => Select2::widget([
                'model' => $searchModel,
                'attribute' => 'item_type',
                'size' => Select2::SMALL,
                'data' => ModelName::getTypesForSelect(),  // Этим методом будем вытаскивать из модели массив для заполнения select. По фен-шую массив нужно передавать из контроллера. 
                'options' => ['placeholder' => 'Фильтр...', 'multiple' => true],
                'pluginOptions' => [
                    'allowClear' => true,
                ],
            ]),
],
В search-модели

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

public function rules()
    {
        return [
        ...
        // Это самый простой вариант, лучше добавить свой метод-валидатор, который проверит, что передаваемой значение есть в массиве типов
            [['item_type'], 'each', 'rule' => ['string']],
        ];
    }   
Массив IN фреймворк сам сформирует, достаточно записи которая уже появится после генерации в gii

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

 $query->andFilterWhere([
            'item_type' => $this->item_type,
]);
Ничего сложного ;)
Модель у меня сгенерированна, с помощью gii, как собственно и rules. но условия, для формирования gridview объявляются не в Search модели, а помощью чистого sql, далее в контроллер arraydataprovider. Там просто порядка 1000строк и средствами фреймворка проблематично такое описать в Search моделе. Возможно ли воспользоваться этим расширением в таком случае?
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Пользовательское добавление условия в sql

Сообщение Nerf »

shon писал(а): 2017.02.13, 20:35 Модель у меня сгенерированна, с помощью gii, как собственно и rules. но условия, для формирования gridview объявляются не в Search модели, а помощью чистого sql, далее в контроллер arraydataprovider. Там просто порядка 1000строк и средствами фреймворка проблематично такое описать в Search моделе. Возможно ли воспользоваться этим расширением в таком случае?
Почему это проблематично написать порядка 1000 строк в поисковой модели? Если логика для поиска, то там ей и самое место. Кто мешает написать, что-то такое:

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

class SearchModel
{
    public $select;
    
    public function search($params) {
        $sql = 'SELECT * FROM table WHERE 5 > 3';
        if ($this->select) {
            $sql .= ' AND WHERE field IN (' . implode(', ', $this->select) . ')';
        }
    }
}
shon
Сообщения: 29
Зарегистрирован: 2017.02.10, 14:13

Re: Пользовательское добавление условия в sql

Сообщение shon »

winzza писал(а): 2017.02.13, 14:21
shon писал(а): 2017.02.13, 13:42
winzza писал(а): 2017.02.13, 12:45

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

...
$list = Yii::$app->request->post('list', 'mouse')
...
$result =  Yii::$app->getDb()->createCommand('
        Select *
         from order_table
         where items_sort in :list
    ')->bindValue(':list', '('.$list.')')
    ->queryAll();

    return $result;
}
Как то так... (Не тестил)
Разве это не жестко задает условием только mouse? Я имел ввиду, что в list должно попадать то,что выбрал пользователь(mouse,как пример был приведен)
По дефолту mouse если в посте list ничего не будет.
Почему-то при любом выборе селекта, использует значение по умолчанию.
winzza
Сообщения: 126
Зарегистрирован: 2015.06.11, 20:30

Re: Пользовательское добавление условия в sql

Сообщение winzza »

shon писал(а): 2017.02.27, 10:56 Почему-то при любом выборе селекта, использует значение по умолчанию.
Смотри что в посте приходит. Возможно строку

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

$list = Yii::$app->request->post('list', 'mouse')
Нужно заменить на нечто подобное этому

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

$list = isset($_POST['ModelName']['list']) ? $_POST['ModelName']['list'] : 'mouse';
Ответить