Php Symfony2 SoftDeleteable不适用于QueryBuilder删除
Softdelete行为通过实体管理器在execute delete语句上运行良好,如下代码所示:Php Symfony2 SoftDeleteable不适用于QueryBuilder删除,php,symfony,doctrine-orm,soft-delete,Php,Symfony,Doctrine Orm,Soft Delete,Softdelete行为通过实体管理器在execute delete语句上运行良好,如下代码所示: $entity = $this->em->getRepository('Users')->find(7); $this->em->remove($entity); $this->em->flush(); 但当通过QueryBuilder执行相同的功能时,硬删除将在数据库上执行 $qb = $this->em->createQueryBuild
$entity = $this->em->getRepository('Users')->find(7);
$this->em->remove($entity);
$this->em->flush();
但当通过QueryBuilder执行相同的功能时,硬删除将在数据库上执行
$qb = $this->em->createQueryBuilder();
$qb->delete('Users', 'p');
$qb->where($qb->expr()->eq('p.id', ':id'));
$qb->setParameters(array("id" => 7));
$result = $qb->getQuery()->getResult();
如何在所有情况下通过实体管理器或查询生成器允许softdelete如果使用DQL,则必须使用查询提示。这应该可以做到:
$query = $qb->getQuery()
$query->setHint(
\Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER,
'Gedmo\SoftDeleteable\Query\TreeWalker\SoftDeleteableWalker'
);
$result = $query->getResult();
更新:
文档提到您必须使用查询提示,但没有提供示例,因此我从他们的测试中提取了用法
文件:
测试用法:在@Ken channel给出上一个答案后,我的旧解决方案是: 编辑: /供应商/doctor/orm/lib/doctor/orm/Query/SqlWalker.php 替换walkDeleteClause函数,如下所示:
public function walkDeleteClause(AST\DeleteClause $deleteClause)
{
$class = $this->em->getClassMetadata($deleteClause->abstractSchemaName);
$tableName = $class->getTableName();
$sql = 'DELETE FROM ' . $this->quoteStrategy->getTableName($class, $this->platform);
$this->setSQLTableAlias($tableName, $tableName, $deleteClause->aliasIdentificationVariable);
$this->rootAliases[] = $deleteClause->aliasIdentificationVariable;
//check if SoftDeleteableListener is attached
foreach ($this->em->getEventManager()->getListeners() as $eventName => $listeners) {
foreach ($listeners as $listener) {
if ($listener instanceof \Gedmo\SoftDeleteable\SoftDeleteableListener) {
$date = date('Y-m-d H:i:s');
$sql = 'UPDATE ' . $this->quoteStrategy->getTableName($class, $this->platform) . " SET deletedAt = ' " . $date . " ' ";
}
}
}
return $sql;
}
但实际上,我认为Ken Channel way更专业,更符合标准。非常感谢亲爱的,我已经通过在库中编辑代码解决了这些问题。。但这种方式更专业,更符合标准