有人可以建议一种使用带有多个"where"子句的 Doctrine (QueryBuilder) 进行此查询的方法吗?



我是QueryBuilder的新手,我正在尝试执行POST请求(使用JSON(以检索数据库中的一些信息。

我使用数组是因为每个属性可以有几个值。这是我目前正在发送的JSON:

{
"name":["Martin"],
"state":["Ohio", "Texas"],
"job":["Photographer", "Reporter"]
}

这是我的数据库:

ID  |   NAME        |   FIRST_NAME  |   STATE       |   JOB             |   SPEAK_FRENCH
1   |   Martin      |   John        |   Ohio        |   Photographer    |   1
2   |   Martin      |   Max         |   Ohio        |   Reporter        |   1
3   |   Martin      |   Sophie      |   Texas       |   Model           |   1
4   |   Alexander   |   David       |   Kansas      |   Author          |   0
5   |   Archie      |   Kira        |   Maine       |   Photographer    |   1
6   |   Lushen      |   Albert      |   Nevada      |   Pilot, Model    |   1
7   |   Wilkins     |   Minnie      |   Utah        |   Tailor          |   0
8   |   Martin      |   Thomas      |   Texas       |   Reporter        |   1
9   |   Patino      |   Stephen     |   Virginia    |   Pilot, Reporter |   1
10  |   Ting        |   Maria       |   Nevada      |   Dentist         |   0
11  |   Brown       |   Barbara     |   Virginia    |   Reporter        |   1
12  |   Martin      |   William     |   Texas       |   Photographer    |   1
13  |   Zachary     |   Thomas      |   Virginia    |   Telephonist     |   1

我想要的请求:

SELECT * FROM 'application'
WHERE SPEAK_FRENCH = 1
AND NAME = "Martin"
AND STATE = "Ohio"
AND JOB LIKE "%Photographer%"
OR SPEAK_FRENCH = 1
AND NAME = "Martin"
AND STATE = "Ohio"
AND JOB LIKE "%Reporter%"
OR SPEAK_FRENCH = 1
AND NAME = "Martin"
AND STATE = "Texas"
AND JOB LIKE "%Photographer%"
OR SPEAK_FRENCH = 1
AND NAME = "Martin"
AND STATE = "Texas"
AND JOB LIKE "%Reporter%"

我目前在Symfony所做的并没有达到我想要的效果:

$repository = $this->getDoctrine()->getRepository(Application::class);
$query = $repository->createQueryBuilder('request');
$temp_name = 0;
$temp_state = 0;
$temp_job = 0;
foreach ($app->getName() as $name) {
$temp_name = $temp_name + 1;
$query = $query->orWhere('request.speakFrench = 1')
->andWhere('request.name LIKE :JSONname' . strval($temp_name))
->setParameter('JSONname' . strval($temp_name), $name);
foreach ($app->getState() as $state) {
$temp_state = $temp_state + 1;
$query = $query->andWhere('request.state LIKE :JSONstate' . strval($temp_state))
->setParameter('JSONstate' . strval($temp_state), $state);
foreach ($app->getJob() as $job) {
$temp_job = $temp_job + 1;
$query = $query->andWhere('request.job LIKE :JSONjob' . strval($temp_job))
->setParameter('JSONjob' . strval($temp_job), '%' . $job . '%');
}
}
}

我的目标是得到这个结果:

ID  |   NAME        |   FIRST_NAME  |   STATE       |   JOB             |   SPEAK_FRENCH
1   |   Martin      |   John        |   Ohio        |   Photographer    |   1
2   |   Martin      |   Max         |   Ohio        |   Reporter        |   1
8   |   Martin      |   Thomas      |   Texas       |   Reporter        |   1
12  |   Martin      |   William     |   Texas       |   Photographer    |   1

我的代码工作不好,它没有发送任何错误,只返回ID : 8

我正在寻找一种只返回ID : 1, 2, 8 and 12的查询方法。

非常感谢你将来的回答。

p.S:我在运行Symfony 4.3.11。

使用条令,例如:

$queryBuilder = $this->createQueryBuilder('request');
$queryBuilder
->andWhere($queryBuilder->expr()->andX(
$queryBuilder->expr()->eq('user.speakFrench', ':speakFrench'),
$queryBuilder->expr()->like('request.name', ':name'),
$queryBuilder->expr()->in('request.state', ':states'),
$queryBuilder->expr()->in('request.job', ':jobs'),
))
->setParameter('speakFrench', true)
->setParameter('name', 'Martin')
->setParameter('states', ['Ohio', 'Texas'])
->setParameter('jobs', ['Photographer', 'Reporter'])
->getQuery()
->getResult();

这应该是一个良好的开端。

继续:

  • 许多条令用法示例:热门示例
  • Check Doctrine\ORM\Query\Expr类,有很多有用的函数。Doctrine Expr GitHub
  • 查看提供了许多示例的文档:条令查询生成器

以下似乎是与您的需求相对应的有效查询:

SELECT * 
FROM application
WHERE SPEAK_FRENCH = 1
AND NAME = "Martin"
AND STATE = IN("Ohio","Texas")
AND (JOB LIKE "%Photographer%" OR JOB LIKE "%Reporter%");

另请参阅在数据库列中存储分隔列表真的那么糟糕吗?

最新更新