Как я могу сделать выбор из базы данных WHRE в массиве - PullRequest
1 голос
/ 16 марта 2020

Мне нужно сделать запрос к базе данных, который включает несколько условий WHERE.

Проблема в том, что я не могу правильно передать массив $ messages в запрос.

public function Controller(Request $request)
    {
        $firstDate = $request->input('start');
        $secondDate = $request->input('end');
        $messages = $request->input('messages');
        $data = $this->client->executeQuery( "SELECT sum('count') as 'var', 'firstname', 'surname' FROM 'table' WHERE 'surname' IN (?) AND 'time' BETWEEN ? AND ? group by 'surname' ORDER BY 'var' desc limit 10",
            [$messages, $startDate, $endDate]);
        $data = $data ->getData();

        return response()->json($data);
    }

Но в результате я получаю ошибку:

сообщение: «Тип привязки ARRAY для параметра 1 не поддерживается»

Я использую tarantool база данных. Есть идеи?

Ответы [ 3 ]

0 голосов
/ 16 марта 2020

попробуйте

$messages = $request->input('messages');
$messages = implode(',',$messages);

тогда ваш код

0 голосов
/ 18 марта 2020

Прежде всего, ваш синтаксис неправильный, он должен быть

executeQuery('...', $messages, $startDate, $endDate);

вместо

executeQuery('...', [$messages, $startDate, $endDate]);

(обратите внимание на избыточный [] в вашей версии).

Во-вторых, если я правильно понимаю ваш вопрос, вам нужно развернуть массив $messages и передать каждое значение в качестве отдельного аргумента executeQuery(). Кроме того, вам необходимо динамически создать оператор SQL с таким количеством заполнителей внутри IN(), как размер массива $message. Как то так:

$placeholders = rtrim(str_repeat('?,', count($messages)), ',');
$params = $messages;
$params[] = $startDate;
$params[] = $endDate;

$sql = "... IN ($placeholders) AND 'time' BETWEEN ? AND ? ...";
$result = $this->client->executeQuery($sql, ...$params);
0 голосов
/ 16 марта 2020

Массивы теперь не поддерживаются в SQL, поэтому вы не можете связать значения типа массива (именно то, что говорится в сообщении об ошибке). Вы можете отслеживать прогресс в поддержке этой функции, подписавшись на соответствующую проблему: https://github.com/tarantool/tarantool/issues/4762

...