2013-10-23 5 views
6

Sto tentando di eliminare un record in Doctrine, ma non so perché non stia eliminando.Elimina record in Doctrine

Ecco il mio codice:

function del_user($id) 
{ 
    $single_user = $entityManager->find('Users', $id); 

    $entityManager->remove($single_user); 

    $entityManager->flush(); 
} 

Inoltre: Come posso eco query per vedere che cosa sta succedendo qui?

+1

dovrebbe essere come questo '$ entità = $ em-> getRepository ('ProjectYourBundle: Utente') -> find ($ id)? –

+0

ti manca 'getRepository' –

risposta

0

prova a var_dump() del $single_user. Se è "null", non esiste?

Controllare anche se "Utenti" è un nome di entità valido (senza spazio dei nomi?) E l'ID $ fa riferimento al PK dell'utente?

Se volete vedere le query che vengono eseguiti controllare il vostro mysql/sql/... Accedi o guardare in Dottrina \DBAL\Logging\EchoSQLLogger

0

È primo repository necessità.

$entityManager->getRepository('Users')->find($id); 

invece di

$single_user = $entityManager->find('Users', $id); 

String 'Users' è il nome degli utenti repository in dottrina (dipende se si sta utilizzando Symfony, Zend.. Ecc).

+0

Questa domanda ha il tag * symfony2 *, perché hai citato Zend? –

+1

perché è sbagliato dichiararlo come una domanda symfony2, è una domanda di dottrina – ROLO

0

controlli l'entità come l'annotazione del commento?

cascade={"persist", "remove"}, orphanRemoval=true 
0

In primo luogo, potrebbe essere necessario controllare se "Utenti" è il nome di classe completo. In caso contrario, aggiornalo al nome della tua classe con le informazioni sullo spazio dei nomi.

Verificare che l'oggetto restituito da find() non sia nullo o falso ed è un'istanza della classe di entità prima di chiamare EM's remove().

Per quanto riguarda l'altra domanda, invece di rendere doctrine restituire SQL, uso solo il mio database (MySQL) per registrare tutte le query (dal suo ambiente di sviluppo giusto).

8

Questa è una vecchia domanda e non sembra avere ancora una risposta. Per riferimento, lo lascio qui per ulteriori riferimenti. Inoltre è possibile controllare il doctrine documentation

Per eliminare un record, è necessario (supponendo che si sta nel controller):

// get EntityManager 
$em = $this->getDoctrine()->getManager(); 

// Get a reference to the entity (will not generate a query) 
$user = $em->getReference('ProjectBundle:User', $id); 

// OR you can get the entity itself (will generate a query) 
// $user = $em->getRepository('ProjectBundle:User')->find($id); 

// Remove it and flush 
$em->remove($user); 
$em->flush(); 

Utilizzando il primo metodo di ottenere un reference di solito è meglio se si desidera solo per elimina l'entità senza prima verificare se esiste o meno, perché non interrogherà il DB e creerà solo un oggetto proxy che puoi utilizzare per eliminare la tua entità.

Se si desidera assicurarsi che questo ID corrisponda a un'entità valida per la prima volta, il secondo metodo è migliore in quanto interrogherà il DB per la propria entità prima di tentare di eliminarlo.

+0

Domanda .. questo problema 2 comandi SQL uno da trovare, uno da eliminare. Questa è una buona cosa? – Dennis

+1

@Dennis Dipende dalle tue esigenze. Ho aggiornato la mia risposta per rispondere alla tua domanda. Grazie. –

2

In un percorso Silex mi piace questo, nel caso aiuta qualcuno:

$app->get('/db/order/delete', function (Request $request) use ($app) { 
... 

    $id = $request->query->get('id'); 

    $em = $app['orm.em']; //or wherever your EntityManager is 
    $order = $em->find("\App\Entity\Orders",$id); //your Entity 

    if($order){ 
    try{ 
     $em->remove($order); 
     $em->flush(); 
    } 
    catch(Exception $e) 
    { 
     return new Response($e->getMessage(), 500); 
    } 
    return new Response("Success deleting order " . $order->getId(), 200); 
    }else{ 
    return new Response("Order Not Found", 500); 
    } 
}