Ale*_*ina 7 database dql symfony doctrine-orm
在我的存储库中,我有这个查询:
$qb = $this->getEntityManager()->createQueryBuilder();
$qb
->update('MyBundle:Entity1', 'e1')
->join('e1.Entity2', 'e2')
->set('e1.visibile', '1')
->andWhere('e2.id = :id')->setParameter("id", 123)
;
Run Code Online (Sandbox Code Playgroud)
抛出这个错误
[Semantical Error] line 0, col 66 near 'e2.id = :id': Error: 'e2' is not defined
Run Code Online (Sandbox Code Playgroud)
我检查了这种关系,这是正确的.在查询更新中使用join是否有任何问题?
Max*_*nce 12
您无法在更新和删除查询时使用联接.你必须使用子查询.
更新和删除查询不支持联接,因为并非所有dbms都支持联接.它不会在Doctrine 1或Doctrine 2中实现.但是,您可以通过使用子查询获得相同的效果.
http://www.doctrine-project.org/jira/browse/DC-646
如果您使用的是MySQL,则使用子查询将无法正常工作.然后,您将使用2个查询.
在MySQL中,您无法修改表并从子查询中的同一个表中进行选择
http://dev.mysql.com/doc/refman/5.0/en/subqueries.html
Doctrine DQL不支持join in update.
尝试执行以下操作:
$qb = $this->getEntityManager()->createQueryBuilder();
$qb
->update('MyBundle:Entity1', 'e1')
->set('e1.visibile', '1')
->where('e1.Entity2 = :id')
->setParameter("id", 123)
;
Run Code Online (Sandbox Code Playgroud)
您可以直接设置链接实体的ID,只要它是主键,就像它是实体一样,Doctrine将映射它.
我在查询中做了完全相同的事情并且它有效.
非常老的问题,但在完整的查询生成器中不包含答案。
所以是的,以下查询不可能同步两个表的字段:
$this->createQueryBuilder('v')
->update()
->join(Pegass::class, 'p', Join::WITH, 'v.identifier = p.identifier')
->set('v.enabled', 'p.enabled')
->where('p.type = :type')
->setParameter('type', Pegass::TYPE_VOLUNTEER)
->andWhere('v.enabled <> p.enabled');
Run Code Online (Sandbox Code Playgroud)
生成的查询不包含该关系,因为如上所述,所有 dbms 均不支持该关系。他们还告诉您改用子查询。
这就是我所做的等效操作(即使使用 2 个查询并且性能较低......):
foreach ([false, true] as $enabled) {
$qb = $this->createQueryBuilder('v');
$sub = $this->_em->createQueryBuilder()
->select('p.identifier')
->from(Pegass::class, 'p')
->where('p.type = :type')
->andWhere('p.enabled = :enabled');
$qb
->setParameter('type', Pegass::TYPE_VOLUNTEER)
->setParameter('enabled', $enabled);
$qb
->update()
->set('v.enabled', $enabled)
->where($qb->expr()->in('v.identifier', $sub->getDQL()))
->getQuery()
->execute();
}
Run Code Online (Sandbox Code Playgroud)
尝试使用子查询代替Join 在您进行更新时在 DQL 中不起作用:
LEFT JOIN 或 JOIN 仅在 MySQL 的 UPDATE 语句中受支持。DQL抽象了通用ansi sql的一个子集,所以这是不可能的。尝试使用子选择:
$qb = $this->getEntityManager()->createQueryBuilder();
$qb ->update('MyBundle:Entity1', 'e')
->set('e.visibile', '1')
->where('e.id IN (SELECT e1.id FROM Entity1 e1 INNER JOIN e2.Entity2 e2 WHERE e2 = :id')
->setParameter("id", 123);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13103 次 |
| 最近记录: |