Синтаксическая ошибка или нарушение доступа: 1064 | Отправка массива с использованием Doctrine (QueryBuilder)

#php #symfony #doctrine

#php #symfony #doctrine

Вопрос:

Я обращаюсь к вам, потому что у меня возникли проблемы с отправкой массива в POST-запросе. Я создал RESTAPI в Symfony 4.3.11.

Этот код работает, если я отправляю только 1 строку в каждый массив :

             $repository = $this->getDoctrine()->getRepository(Application::class);

            $query = $repository->createQueryBuilder('request');
            $query
                ->andWhere($query->expr()->Andx(
                    $query->expr()->eq('request.curr', ':curr'),
                    $query->expr()->eq('request.country', ':JSONcountry'),
                    $query->expr()->eq('request.type', ':JSONtype'),
                    $query->expr()->eq('request.job', ':JSONjob'),
                ))
                ->setParameter('curr', true)
                ->setParameter('JSONcountry', $app->getCountry())
                ->setParameter('JSONtype', $app->getType())
                ->setParameter('JSONjob', $app->getJob());

            echo $query;
            $query = $query->getQuery();
            $applications = $query->getResult();

            return $applications;
  

Но когда я пытаюсь отправить этот тип JSON :

 {
    "caisse":["FRANCE", "ESPAGNE"],
    "type":["FR", "ES"],
    "job":["CHIEF", "TEST"]
}
  

Он возвращает эту ошибку :

     "code": 500,
    "message": "An exception occurred while executing 'SELECT ...' with params [1, "FRANCE", "ESPAGNE", "FR", "ES", "CHEF", "TEST"]:nnSQLSTATE[42000]: 
    Syntax error or access violation: 1064"

}
  

Я искал ошибку в Интернете и обнаружил, что эта ошибка часто появляется, когда синтаксис неправильный или когда чего-то не хватает, но в моем случае код работает.

У меня также есть второй вопрос: в моем случае, как выполнить оператор «LIKE» для каждой строки в массиве? Я видел способ сделать это, но только для строки : ->setParameter('JSONcountry', '%' . $app->getCountry() . '%')

Если у вас есть какие-либо вопросы или предложения по моему коду, не стесняйтесь спрашивать.

Спасибо.

Ответ №1:

Если ваш параметр является массивом, вам следует использовать функцию $query-> expr()->in(…) вместо equal . Я предполагаю, что вы ищете объекты, которые соответствуют любому из элементов в массиве.

 $repository = $this->getDoctrine()->getRepository(Application::class);

$query = $repository->createQueryBuilder('request');
$query
    ->andWhere($query->expr()->Andx(
        $query->expr()->eq('request.curr', ':curr'),
        $query->expr()->in('request.country', ':JSONcountry'),
        $query->expr()->in('request.type', ':JSONtype'),
        $query->expr()->in('request.job', ':JSONjob'),
   ))
   ->setParameter('curr', true)
   ->setParameter('JSONcountry', $app->getCountry())
   ->setParameter('JSONtype', $app->getType())
   ->setParameter('JSONjob', $app->getJob());

echo $query;
$query = $query->getQuery();
$applications = $query->getResult();

return $applications;
  

Комментарии:

1. Это работает так, как я хотел с этим @diegowc. Вы знаете, как я могу добавить свой оператор LIKE для каждой строки в моем массиве? Например, у меня есть «тип» в моей базе данных, который является «FR, fra», и в настоящее время он его не вернул.

2. Вы можете выполнить $query->andWhere(‘request.x LIKE :x’)->setParameter(‘x’, ‘%’ . $x . ‘%’) но это не сработает, если $ x является массивом. В вашем случае вам нужно было бы выполнить цикл for для этого массива и на каждой итерации добавлять ПОДОБНОЕ сравнение $query->andWhere(‘request.x LIKE :x’ . $index)->setParameter(‘x’ . $index, ‘%’ . $x[$index] . ‘%’)