Symfony 2 - Doctrine 2 - Native Sql - 删除查询

时间:2014-01-08 16:01:52

标签: php sql database symfony doctrine-orm

而不是使用

逐个删除我的实体
$this->em->remove($price);

我想执行本机SQL查询来删除我的所有实体。

以下是我尝试的内容:

$sqlQuery = "delete from mytable where mytable.fieldone_id = ".$fieldoneid." and mytable.fieldtwo_id = ".$fieldtwoid.";";

$query = $this->getEntityManager()->createNativeQuery($sqlQuery);

$query->execute();

返回以下错误:

Catchable fatal error: Argument 2 passed to Doctrine\ORM\EntityManager::createNativeQuery() must be an instance of Doctrine\ORM\Query\ResultSetMapping, none given

它要我传递ResultSetMapping,但它是删除查询...

有人可以教我怎么做吗?

3 个答案:

答案 0 :(得分:19)

在我看来,我使用一种更简单的执行本机SQL查询的方式。尝试这样的事情(我也在使用PDO方法在查询中包含变量,这样更安全):

$sql = "delete from mytable where mytable.fieldone_id = :fieldoneid and mytable.fieldtwo_id = :fieldtwoid";
$params = array('fieldoneid'=>$fieldoneid, 'fieldtwoid'=>$fieldtwoid);

$em = $this->getDoctrine()->getManager();
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute($params);
// if you are doing a select query, fetch the results like this:
// $result = $stmt->fetchAll();

这对我很有用,希望有所帮助

答案 1 :(得分:3)

根据Doctrine 2 Native SQL documentation page

  

如果要执行DELETE,UPDATE或INSERT语句,则无法使用Native SQL API,并且可能会抛出错误。

您可以改为使用DQL查询。

$query = $em->createQuery("DELETE FROM YourNamespace\YourBundle\Entity\YourEntity e WHERE e.fieldone_id = " .$fieldoneid . " AND e.fieldtwo_id = " . $fieldtwoid);
$query->execute();

答案 2 :(得分:0)

如果要在学说中使用本机方式,则可以在实体存储库中使用:

public function deleteUserNative(User $user): void
{
    $this->getEntityManager()->getConnection()->delete('user', array('id' => $user->getId()));
}

只需在您的控制器中调用它即可:

$em->getRepository(User::class)->deleteUserNative($user);

此致