2014-12-16 20 views
10

Tôi đang di chuyển một ứng dụng web cũ dựa trên SQL Server và ASP sang Symfony2 và MySQL. Tôi đã thực hiện một số truy vấn và xuất dữ liệu cũ thành các tệp SQL riêng lẻ. Làm thế nào tôi có thể chạy các file thoses trong đồ đạc của tôi, khi tôi chạy lệnhSymfony2 thực thi tệp SQL trong Doctrine Fixtures Tải

$php app/console doctrine:fixtures:load 

Bây giờ tôi có một số đồ đạc mà làm việc trực tiếp với Học thuyết ORM và các tổ chức, nhưng tôi có rất nhiều dữ liệu để nhập khẩu.

Trả lời

11

Tôi tìm thấy một giải pháp tốt. Tôi đã không tìm thấy một phương pháp exec trong lớp ObjectManager, vì vậy ... công việc này rất tốt cho tôi.

public function load(ObjectManager $manager) 
{ 
    // Bundle to manage file and directories 
    $finder = new Finder(); 
    $finder->in('web/sql'); 
    $finder->name('categories.sql'); 

    foreach($finder as $file){ 
     $content = $file->getContents(); 

     $stmt = $this->container->get('doctrine.orm.entity_manager')->getConnection()->prepare($content); 
     $stmt->execute(); 
    } 
} 

Trong giải pháp này lớp vật cố của bạn có để thực hiện các ContainerAwareInterface với phương pháp

public function setContainer(ContainerInterface $container = null) 
{ 
    $this->container = $container; 
} 
+1

sử dụng Symfony \ Component \ Finder \ Finder; – Nicodemuz

11

Bạn có thể tải các nội dung tập tin như là một chuỗi, và thực hiện SQL có nguồn gốc sử dụng EntityManager:

class SQLFixtures extends AbstractFixture implements OrderedFixtureInterface 
{  
    $filename = '/path/to/sql/file.sql'; 

    public function load(ObjectManager $manager) { 
    $sql = file_get_contents($filename); // Read file contents 
    $manager->getConnection()->exec($sql); // Execute native SQL 

    $manager->flush(); 
    } 

    public function getOrder() { 
    return 99; // Order in which this fixture will be executed 
    } 
} 
0

trả lời cho Zend Framework 2.5.3 sử dụng Doctrine Data-Fixtures.

Không chắc chắn nếu điều này áp dụng cho câu trả lời đã cho, nhưng họ đang cố gắng một chút quá khó. Nếu bạn kiểm tra đối tượng $manager đã cho, bạn sẽ thấy rằng nó đã là EntityManager (trong số interface ObjectManager) (ít nhất, trong ZF2). Vì vậy, bạn có thể trực tiếp nhận được Connection và có thể thực thi mà không cần sử dụng $this->container->get('doctrine.orm.entity_manager')

Bên dưới một đoạn mã mà tôi sử dụng để tạo "hệ thống" người dùng đầu tiên với tham chiếu FK createdBy.

public function load(ObjectManager $manager) 
{ 
    $sql = 'INSERT INTO users (
       id, username, email, display_name, `password`, created_by) 
      VALUES (:id, :username, :email, :display_name, :password, :created_by)'; 

    $password = $this->createSuperDuperEncryptedPassword(); 

    // $manager === `EntityManager|ObjectManager`, `->getConnection()` is available 
    $stmt = $manager->getConnection()->prepare($sql); 

    $stmt->bindValue(':id', 1); 
    $stmt->bindValue(':username', 'system'); 
    $stmt->bindValue(':email', '[email protected]'); 
    $stmt->bindValue(':display_name', 'system'); 
    $stmt->bindValue(':password', password); 
    $stmt->bindValue(':created_by', 1);  // Self reference 
    $stmt->execute(); 
} 
Các vấn đề liên quan