Symfony点击更新布尔字段的查询语法问题求助
修正Symfony中布尔字段更新的QueryBuilder代码
你这段代码确实有几个语法和用法上的问题,我帮你一步步修正:
原代码的问题点:
update('aq')是冗余的:createQueryBuilder('aq')已经指定了实体的别名,QueryBuilder的update()方法不需要再传入别名(如果要指定实体类,应该传入完整类名,但这里用别名的话直接调用update()即可)。set('aq.asked = 1')语法错误:QueryBuilder的set()方法需要两个参数,第一个是字段名,第二个是要设置的值(或者参数占位符),正确格式是set('aq.asked', 1)或者参数绑定的写法。where('aq.asked = :asked')没有绑定参数:你定义了:asked占位符,但没有设置对应的参数值,会导致数据库报错。- 多余的
orderBy():更新操作不需要排序,这个语句完全没必要,反而会导致SQL语法错误。 - 错误使用
getResult():更新、插入、删除这类写操作,应该用execute()方法来执行,它会返回受影响的行数;getResult()是用来获取查询结果集的,不适合写操作。
修正后的代码(推荐参数绑定写法,更安全):
return $this->getRepository() ->createQueryBuilder('aq') ->update() ->set('aq.asked', ':newValue') ->where('aq.asked = :oldValue') ->setParameter('newValue', true) // 或者1,取决于你数据库字段类型是布尔还是tinyint ->setParameter('oldValue', false) // 对应原条件里的:asked,这里明确命名更清晰 ->getQuery() ->execute();
如果你的数据库字段是tinyint类型,也可以直接传数字:
return $this->getRepository() ->createQueryBuilder('aq') ->update() ->set('aq.asked', 1) ->where('aq.asked = 0') ->getQuery() ->execute();
补充说明:
如果是要更新特定ID的记录(通常点击事件应该对应某条具体数据),建议在where条件里加上ID的判断,避免误批量更新所有符合条件的记录:
->where('aq.id = :id') ->andWhere('aq.asked = :oldValue') ->setParameter('id', $yourEntityId)
内容的提问来源于stack exchange,提问作者Филип Стојановић
相关产品推荐
相关产品推荐

