2011-12-15 40 views

Trả lời

21

Cắt bớt một bảng với Học thuyết là như "đơn giản" như:

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

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

Nhưng bạn phải biết rằng MySQL sẽ không thể cắt bất kỳ bảng khi nó có một ràng buộc khoá ngoại.

+0

Vậy làm thế nào chúng ta có thể truncat – Acyra

+0

On MySQL, bạn có thể không phải là lúc bạn đã phím nước ngoài thành lập ... – Herzult

+1

'executeUpdate() 'hiện không được chấp nhận. Câu trả lời này có thể được cập nhật không? – Alec

12

Bạn có thể cắt xén dữ liệu trong MySQL qua Học thuyết để nó bỏ qua ràng buộc khoá ngoại ...

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

thông số cấu hình không được công nhận "foreign_key_checks" – FabulousCo

0

biến Ngắn (hữu ích nhất trong cuộc di cư)!

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

câu hỏi có liên quan đến học thuyết 2, chứ không phải học thuyết 1 – JamesHalsall

4

Tôi đã khái quát câu trả lời trước cho một chức năng tốt mà tôi đã sử dụng trong dự án của mình, vui lòng chia sẻ.

/** 
* @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

Nếu bạn muốn loại bỏ các đối tượng bao gồm các đơn vị có liên quan mà cuối cùng được nối với nhau bằng các phím nước ngoài bạn có thể sử dụng một truy vấn hàng loạt đơn giản DQL thay vì cắt bỏ:

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

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

này sẽ chỉ làm việc với các liên kết nếu bạn đã định cấu hình đúng hoạt động xếp tầng và orphanRemoval ví dụ:

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

Đây không phải là câu trả lời trực tiếp liên quan đến lệnh MySQL TRUNCATE nhưng vì nó được thực hiện cho Doctrine cách tiếp cận này có thể giải quyết vấn đề của bạn.

2

Nếu bạn gặp rắc rối với chính nước ngoài tôi làm việc với:

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

$connection->query('DELETE FROM reception_detail'); 
$connection->query('ALTER TABLE reception_detail AUTO_INCREMENT = 1'); 
Các vấn đề liên quan