如何解决有人可以建议使用带有多个“ where”子句的DoctrineQueryBuilder进行此查询的方法吗?
我是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。
解决方法
以下内容似乎是与您的要求相对应的有效查询:
SELECT *
FROM application
WHERE SPEAK_FRENCH = 1
AND NAME = "Martin"
AND STATE = IN("Ohio","Texas")
AND (JOB LIKE "%Photographer%" OR JOB LIKE "%Reporter%");
另外,请参见Is storing a delimited list in a database column really that bad?
,借助“教义”,您可以为例:
$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();
那应该是一个好的开始。
要继续:
- 许多教义用法示例:Hot examples
- 检查Doctrine \ ORM \ Query \ Expr类,有很多有用的功能。 Doctrine Expr GitHub
- 查看提供许多示例的文档:Doctrine Query Builder
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。