BENARD Patrick
BENARD Patrick

Reputation: 30975

Symfony 2 - Doctrine 2 - Native Sql - Delete Query

Instead of removing my entities one by one with

$this->em->remove($price);

I would like to execute a native SQL query to delete all my entities.

Here is what I tried :

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

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

$query->execute();

It returns the following error :

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

It wants me to pass a ResultSetMapping, but it is a delete query...

Can anyone please teach me how to do it?

Upvotes: 11

Views: 18587

Answers (3)

Yohann Daniel Carter
Yohann Daniel Carter

Reputation: 975

If you want to use the native way in doctrine, you can use in the entity repository :

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

And just call this in your controller :

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

Regards,

Upvotes: 1

Sehael
Sehael

Reputation: 3736

I use a different way of executing native SQL queries that is much easier, in my opinion. Try something like this (I am also using the PDO method of including variables in the query, which is safer):

$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();

This works great for me, hope it helps

Upvotes: 23

reafle
reafle

Reputation: 254

as per Doctrine 2 Native SQL documentation page:

If you want to execute DELETE, UPDATE or INSERT statements the Native SQL API cannot be used and will probably throw errors.

You can user DQL queries instead.

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

Upvotes: 3

Related Questions