2013-03-25 38 views
9

Bây giờ, tôi đã tạo ra một hàm để truy xuất dữ liệu từ cơ sở dữ liệu bằng cách sử dụng hàm createQueryBuilder của Doctrine.Có thể sử dụng createQueryBuilder để chèn/cập nhật không? Nếu không, tôi nên sử dụng chức năng nào?

Có ai biết nếu có chức năng tương tự để chèn hoặc cập nhật cơ sở dữ liệu không? Hoặc làm thế nào tôi có thể sử dụng createQueryBuilder?

+0

Bạn, dude, cần phải có một cái nhìn sâu để Symfony2, Giáo Lý và vân vân .... – DonCallisto

Trả lời

23

Học thuyết 2 ORM không hỗ trợ INSERT qua DQL hoặc DQL query builder. Để có cú pháp hoàn chỉnh, hãy kiểm tra the EBNF of DQL.

Để xử lý chèn trong ORM, bạn luôn tự khởi tạo một thực thể và duy trì nó với người quản lý thực thể:

$user = new \My\Entity\User(); 

$entityManager->persist($user); 
$entityManager->flush(); 

Bạn chỉ có thể xử lý SELECT, UPDATEDELETE qua DQL trong Học thuyết ORM:

  • Chọn:

    SELECT u FROM My\Entity\User u WHERE u.id = :userId 
    
  • Cập nhật:

    UPDATE My\Entity\User u SET u.status = 'banned' WHERE u.id = :userId 
    
  • Xóa

    DELETE My\Entity\User u WHERE u.id = :userId 
    

Bạn có thể xử lý các hoạt động này với QueryBuilder cũng như:

  • Chọn:
$queryBuilder = $entityManager->createQueryBuilder(); 
    $queryBuilder 
     ->select('u') 
     ->from('My\Entity\User', 'u') 
     ->where($queryBuilder->expr()->eq('u.id', ':userId')); 
  • Xóa:
$queryBuilder = $entityManager->createQueryBuilder(); 
    $queryBuilder 
     ->delete('My\Entity\User', 'u') 
     ->where($queryBuilder->expr()->eq('u.id', ':userId')); 
  • Cập nhật:
$queryBuilder = $entityManager->createQueryBuilder(); 
    $queryBuilder 
     ->update('My\Entity\User', 'u') 
     ->set('u.status', 'banned') 
     ->where($queryBuilder->expr()->eq('u.id', ':userId')); 
+0

Cảm ơn bạn rất nhiều vì câu trả lời của bạn :) – user1482442

+0

Làm cách nào để thực hiện cập nhật và chèn vào cùng một giao dịch? Tôi phải sử dụng truy vấn sql nguyên gốc để thay thế? – Geany

+0

xem '$ entityManager-> transactional()' – Ocramius

3

Một tùy chọn khác mà bạn có thay vì sử dụng QueryBuilder, đang sử dụng các hàm chuẩn bị và thực thi của Doctrine DBAL. Có lẽ là không linh hoạt như sử dụng QueryBuilder, nhưng để làm INSERT trong một số tình huống có thể hữu ích.

Cách sử dụng là lấy Kết nối cơ sở dữ liệu từ Trình quản lý đối tượng.

$sql = "INSERT INTO table (field1, field2) VALUES ('foo', 'var')"; 
$stmt = $em->getConnection()->prepare($sql); 
$stmt->bindValue(':invoice', $invoiceId); 
$result = $stmt->execute(); 
+3

có lý do tại sao ORM không cho phép điều này. Ý tưởng là luôn luôn đi qua các trình nghe khác nhau, thứ tự cam kết được tính toán và chuyển đổi kiểu DBAL. – Ocramius

0

sử dụng QueryBuilder để chèn dữ liệu là không thể trừ khi bạn sẵn sàng viết DQL hoặc SQL.Nếu bạn đang tìm kiếm một cách để chèn dữ liệu vào bảng cơ sở dữ liệu của mình, trước tiên bạn phải đảm bảo dữ liệu được nạp vào một lớp Entity cho bảng mà bạn muốn chèn dữ liệu của mình vào. Ví dụ: $em->persist($entity);

2

Nếu bạn sử dụng DBAL queryBuilder, bạn có thể chèn.

$qb = $connection->createQueryBuilder(); 

Để chèn với queryBuilder nó là như thế này:

$qb->insert('MuBundle:MyClass', 'momc') 
    ->values (array(
     'property1 (id for example)' => '?' 
     'property2 (name for exmaple)' => '?' 
    )) 
    ->setParameter(0, $id) 
    ->setparameter(1, $name) 
Các vấn đề liên quan