$diskTypes_command = Yii::$app->db->createCommand('SELECT id FROM disk_type WHERE name IN (:result_disk_types)');
$diskTypes_command->bindValue(':result_disk_types', $result_disk_types);
$diskTypes_query = $diskTypes_command->queryAll();
Изначально приходит массив, составлял строку вида: 'значение 1', 'значение 2'. Не прокатывает. Если просто вставляешь IN ('значение 1', 'значение 2') - работает, если через bindValue передаешь строку 'значение 1', 'значение 2' - не работает.
$result_disk_types = ['type1', 'type2'];
$diskTypes_query = Yii::$app->db->createCommand('SELECT id FROM disk_type WHERE name IN :result_disk_types')
->bindValue(':result_disk_types', $result_disk_types);
->queryAll();
$result_disk_types = ['type1', 'type2'];
$diskTypes_query = Yii::$app->db->createCommand('SELECT id FROM disk_type WHERE name IN :result_disk_types')
->bindValue(':result_disk_types', $result_disk_types);
->queryAll();
Так тоже пробовал, результат:
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''Array'' at line 1
The SQL being executed was: SELECT id FROM disk_type WHERE name IN Array
Alex21 писал(а): ↑2017.07.01, 17:07
Добрый день!
Создаю запросы к бд MySQL через DAO. Голову сломал, пытаясь вставить в IN последовательность значений.
$diskTypes_command = Yii::$app->db->createCommand('SELECT id FROM disk_type WHERE name IN (:result_disk_types)');
$diskTypes_command->bindValue(':result_disk_types', $result_disk_types);
$diskTypes_query = $diskTypes_command->queryAll();
Изначально приходит массив, составлял строку вида: 'значение 1', 'значение 2'. Не прокатывает. Если просто вставляешь IN ('значение 1', 'значение 2') - работает, если через bindValue передаешь строку 'значение 1', 'значение 2' - не работает.
Спасибо вам всем большое за ответы. Думаю использовать Query Builder, как посоветовал mkramer. Еще остался вопрос, что быстрее DAO или Query Builder, будет ли проигрыш в скорости работы?
QueryBuilder - это надстройка над DAO, так что не будет видимого проигрыша в скорости. Это ещё не ActiveRecord, который этот проигрыш даёт, поскольку там гораздо больше надстроено над запросами. Но тоже, значимый проигрыш по скорости ActiveRecord будет давать при большой нагрузке на сайт, для небольших сайтов с потенциально небольшим количеством посетителей очень удобно использовать, хотя и говорят, что это антипаттерн.
mkramer писал(а): ↑2017.07.01, 20:32
QueryBuilder - это надстройка над DAO, так что не будет видимого проигрыша в скорости. Это ещё не ActiveRecord, который этот проигрыш даёт, поскольку там гораздо больше надстроено над запросами. Но тоже, значимый проигрыш по скорости ActiveRecord будет давать при большой нагрузке на сайт, для небольших сайтов с потенциально небольшим количеством посетителей очень удобно использовать, хотя и говорят, что это антипаттерн.
Спасибо за помощь! Значит буду использовать QueryBuilder. ActiveRecord использовал в другом проекте, по удобству его использования мне он тоже понравился.
У ActiveRecord тоже есть возможность делать запросы с IN из массива.
Точнее это у ActiveQuery, который отвечает за поиск.
DiskType::find()->andWhere(['name' => $result_disk_types])->all();
Besides column names, you can also select DB expressions. You must use the array format when selecting a DB expression that contains commas to avoid incorrect automatic name quoting. For example,
$query->select(["CONCAT(first_name, ' ', last_name) AS full_name", 'email']);