#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] . ‘%’)