【发布时间】:2017-10-27 09:20:10
【问题描述】:
我正在使用 symfony+sqllite 来测试我的应用程序,但我遇到了 ORM 问题。 Doctrine 在 JOIN 中生成带有双 ON 的 sql,类似于:
选择 s0_.config AS config_0, s0_.sensor_number AS sensor_number_1 FROM 传感器 s0_ 左连接 fos_user f1_ 左连接工人 w2_ ON f1_.id = w2_.id LEFT JOIN 经销商 d3_ ON f1_.id = d3_.id ON (s0_.owner_id = f1_.id) AND (f1_.status != 'd') LEFT JOIN user_groups u4_ ON (f1_.user_group_id = u4_.id) AND (u4_.status != 'd') WHERE (s0_.status = ?和 u4_.id = ? AND ((s0_.device_id IS NULL OR s0_.device_id = ?))) AND ((select user_group_id from fos_user where id = s0_.owner_id) = '1') AND (s0_.status != 'd')
它是关于:
ON f1_.id = d3_.id ON (s0_.owner_id = f1_.id)
导致错误:
SQLSTATE[HY000]: 一般错误: 1 near \"ON\": syntax error","class":"Doctrine\DBAL\Exception\SyntaxErrorException"
我检查过,我知道 SQLite 不能使用多个“ON”(postgresSQL 有效),那么为什么在运行测试时教义会生成它。
对此负责的 Symfony 表单:
$builder->add(
'sensors',
EntityType::class,
[
'class' => Sensors::class,
'label' => 'form.assigned-sensors',
'required' => false,
'multiple' => true,
'by_reference' => false,
'query_builder' => function (EntityRepository $er) use ($device, $userGroup) {
$qb = $er->createQueryBuilder('s')
->leftJoin(User::class, 'o', 'WITH', 's.owner = o.id')
->leftJoin(UserGroups::class, 'g', 'WITH', 'o.userGroup = g.id')
->where('s.status = :status')
->andWhere('g.id = :userGroupId')
->andWhere('(s.device is null or s.device = :deviceId)')
->setParameter('status', 'a')
->setParameter('deviceId', $device->getId())
->setParameter('userGroupId', $userGroup->getId());
return $qb;
},
]
);
编辑:
最后我发现了我在下面的回答中描述的问题。感谢您的宝贵时间。
【问题讨论】:
-
LEFT JOIN tab4 d3_ ON f1_.id = d3_.id ON (s0_.o你有一个没有加入的人 -
提供负责运行此查询的 PHP 代码。
-
LEFT JOIN tab4 d3_ ON f1_.id = d3_.id ON - 它适用于 postgressql
-
我已添加生成此查询的表单。
标签: sqlite symfony doctrine-orm