【问题标题】:Doctrine update query with equal operator as set设置相等运算符的教义更新查询
【发布时间】:2015-11-30 16:47:47
【问题描述】:

我无法根据语句设置值

我想激活特定的uc 并停用所有其他ucs。

(uc.collection = :collectionId) 应该返回 true 或 false 以便正确处理。

查询生成器:

    $queryBuilder = $this->getEntityManager()->createQueryBuilder();
    $queryBuilder->update('TestBundle:UserCollection', 'uc')
        ->set('uc.active', '(uc.collection = :collectionId)')
        ->where('uc.user = :userId');

    $queryBuilder->setParameter('collectionId', $collectionId);
    $queryBuilder->setParameter('userId', $userId);

输出 DQL:

UPDATE TestBundle:UserCollection uc 
SET uc.active = (uc.collection = :collectionId) WHERE uc.user = :userId

getSQL 错误:

[Syntax Error] line 0, col 81: Error: Expected 
Doctrine\ORM\Query\Lexer::T_CLOSE_PARENTHESIS, got '='

这里是我想要的 SQL:

UPDATE user_collections AS uc SET uc.active = (uc.idCollections = 1)
WHERE uc.idUsers = 74

【问题讨论】:

  • 呃,你为什么要在一开始就使用括号?
  • 没有我得到这个错误[Syntax Error] line 0, col 80: Error: Expected end of string, got '='
  • 你得到它是有原因的。为了便于阅读,我现在将写一个答案,这可能会对您有所帮助...
  • 没有( DQL 看起来不对... SET uc.active = c.id = :collectionId WHERE ...
  • 确实添加了更多信息和我想要的 SQL

标签: php mysql sql symfony doctrine-orm


【解决方案1】:

尝试通过expr()->eq(...) 表达式进行设置:

$queryBuilder = $this->getEntityManager()->createQueryBuilder();
$queryBuilder->update('TestBundle:UserCollection', 'uc')
    ->set('uc.active', $queryBuilder->expr()->eq('uc.collection', ':collectionId'))
    ->where('uc.user = :userId');

$queryBuilder->setParameter('collectionId', $collectionId);
$queryBuilder->setParameter('userId', $userId);

【讨论】:

  • 没有工作 DQL 看起来也不正确 ... SET uc.active = collection.id = :collectionId WHERE ... [Syntax Error] line 0, col 80: Error: Expected end of string, got '='
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-14
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多