2011-12-15 27 views

Odpowiedz

21

Obcinanie tabelę z doktryną jest „proste” jak:

$connection = $entityManager->getConnection(); 
$platform = $connection->getDatabasePlatform(); 

$connection->executeUpdate($platform->getTruncateTableSQL('my_table', true /* whether to cascade */)); 

Ale trzeba wiedzieć, że MySQL nie będzie w stanie obciąć dowolną tabelę raz ma klucz obcy.

+0

Więc jak możemy truncat – Acyra

+0

Na MySQL, nie można natomiast masz klucze obce skonfigurować ... – Herzult

+1

'executeUpdate() 'jest teraz przestarzałe. Czy ta odpowiedź może zostać zaktualizowana? – Alec

12

Można obciąć danych w MySQL za pośrednictwem Doktryny tak że ignoruje kluczy obcych ...

$connection->executeQuery('SET FOREIGN_KEY_CHECKS = 0;'); 
$truncateSql = $platform->getTruncateTableSQL('table_name'); 
$connection->executeUpdate($truncateSql); 
$connection->executeQuery('SET FOREIGN_KEY_CHECKS = 1;'); 
+0

nierozpoznany parametr konfiguracyjny "foreign_key_checks" – FabulousCo

0

Krótki wariant (najbardziej przydatny w migracjach)!

Doctrine_Manager::getInstance()->getConnection('doctrine')->getDbh()->exec("TRUNCATE name"); 
+0

pytanie dotyczy doktryny 2, a nie doktryny 1 – JamesHalsall

4

Uogólniłem odpowiedź wcześniej na fajną funkcję, której użyłem w moim projekcie, nie krępuj się udostępniać.

/** 
* @param array $tableNames Name of the tables which will be truncated. 
* @param bool $cascade 
* @return void 
*/ 
public function truncateTables($tableNames = array(), $cascade = false) { 
    $connection = $this->em->getConnection(); 
    $platform = $connection->getDatabasePlatform(); 
    $connection->executeQuery('SET FOREIGN_KEY_CHECKS = 0;'); 
    foreach ($tableNames as $name) { 
     $connection->executeUpdate($platform->getTruncateTableSQL($name,$cascade)); 
    } 
    $connection->executeQuery('SET FOREIGN_KEY_CHECKS = 1;'); 
} 
0

Jeśli chcesz usunąć podmioty w tym podmiotów powiązanych, które są ostatecznie połączone kluczy obcych można użyć po prostu DQL zapytanie wsadowy zamiast obcinania:

$q = $em->createQuery('delete from AppBundle\Entity\Customer'); 
$numDeleted = $q->execute(); 

http://doctrine-orm.readthedocs.org/en/latest/reference/batch-processing.html#dql-delete

tylko to będzie pracować ze skojarzeniami, jeśli poprawnie skonfigurowano operacje kaskadowe i orphanRemoval np .:

class Customer 
{ 
    /** 
    * @ORM\OneToOne(targetEntity="Address", cascade={"all"}, orphanRemoval=true) 
    */ 
    public $address; 
} 

To nie jest bezpośrednia odpowiedź dotycząca polecenia MySQL TRUNCATE, ale ponieważ jest to przypisane do Doctrine, to podejście może rozwiązać twój problem.

2

Jeśli masz problem z kluczem obcym mi pracować:

$connection = $this->em->getConnection(); 
$connection->beginTransaction(); 

$connection->query('DELETE FROM reception_detail'); 
$connection->query('ALTER TABLE reception_detail AUTO_INCREMENT = 1'); 
Powiązane problemy