Красноречивый ГДЕ с использованием необработанного менеджера запросов / капсул - PullRequest
1 голос
/ 07 марта 2019

Я хочу написать этот запрос красноречиво, используя необработанные запросы:

INSERT INTO table SELECT * FROM other_table WHERE other_table_id IN (1,2,3)

Я пытался написать его так:

use Illuminate\Database\Capsule\Manager as DB;
$insert_db = DB::select("SELECT products_id FROM products WHERE products_id IN (?)", [[265792,265787,265743]])

Но это дает мне пустой массивв следствии.

Как правильно написать это с помощью диспетчера капсул?(Мне абсолютно необходимо сделать это, используя DB::select)

Этот вопрос задает то же самое, еще в 2013 году. Тогда это было невозможно.Так что изменилось сегодня?Можем ли мы использовать WHERE IN (?) в последних версиях eloquent?Зная, что мне НУЖНО использовать ? для обеспечения безопасности, а не объединять строку, иначе было бы бессмысленно использовать PDO вообще.

РЕДАКТИРОВАТЬ:

Вопрос больше о динамических значениях.Я не могу использовать:

DB::select("SELECT products_id FROM products WHERE products_id IN (?, ?, ?)", [265792,265787,265743]);

Поскольку массив [265792,265787,265743] создается в другом месте.Итак, представьте следующий код

foreach($test as $k => $v) {
    $arr[] = $v['something']
}

DB::select("SELECT products_id FROM products WHERE products_id IN (?)", [[$arr]]);

Ответы [ 2 ]

2 голосов
/ 07 марта 2019

Вам необходим заполнитель для каждой привязки:

$placeholders = implode(', ', array_fill(0, count($arr), '?'));
DB::select("SELECT products_id FROM products WHERE products_id IN ($placeholders)", [$arr]);

В Laravel / Eloquent 5.7.17+ вы можете использовать insertUsing():

DB::table('table')->insertUsing(['foo', 'bar'], function ($query) use ($arr) {
    $query->from('other_table')
        ->whereIn('other_table_id', $arr);
});

Обратите внимание, что метод требуетуказать имена столбцов (['foo', 'bar']).

1 голос
/ 07 марта 2019

Более чистый подход для создания заполнителей ?, заключается в использовании str_repeat:

$in = str_repeat('?,', count($arr) - 1) . '?';

Редактировать # 1

Для обработки случаев, когда в вашем массиве есть ноль элементов, я придумал следующую функцию:

function in($arr)
{
  return count($arr) > 0 ? str_repeat('?,', count($arr) - 1) . '?' : false;
}

Пример из жизни

Repl

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...