Câu trả lời:
Đây là ví dụ về một truy vấn thô trong Doctrine 2 mà tôi đang thực hiện:
public function getAuthoritativeSportsRecords()
{
$sql = "
SELECT name,
event_type,
sport_type,
level
FROM vnn_sport
";
$em = $this->getDoctrine()->getManager();
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
return $stmt->fetchAll();
}
...getConnection()->query($sql);
và không phải chạy$stmt->execute();
EntityManagerInterface $entityManager
và sau đó gọi$entityManager->getConnection()
//$sql - sql statement
//$em - entity manager
$em->getConnection()->exec( $sql );
Tôi đã làm cho nó hoạt động bằng cách làm điều này, giả sử bạn đang sử dụng PDO.
//Place query here, let's say you want all the users that have blue as their favorite color
$sql = "SELECT name FROM user WHERE favorite_color = :color";
//set parameters
//you may set as many parameters as you have on your query
$params['color'] = blue;
//create the prepared statement, by getting the doctrine connection
$stmt = $this->entityManager->getConnection()->prepare($sql);
$stmt->execute($params);
//I used FETCH_COLUMN because I only needed one Column.
return $stmt->fetchAll(PDO::FETCH_COLUMN);
Bạn có thể thay đổi FETCH_TYPE để phù hợp với nhu cầu của mình.
Kết nối với người quản lý của bạn và tạo một kết nối mới:
$manager = $this->getDoctrine()->getManager();
$conn = $manager->getConnection();
Tạo truy vấn của bạn và tìm nạp Tất cả:
$result= $conn->query('select foobar from mytable')->fetchAll();
Lấy dữ liệu ra khỏi kết quả như thế này:
$this->appendStringToFile("first row foobar is: " . $result[0]['foobar']);
Tôi phát hiện ra câu trả lời có lẽ là:
NativeQuery cho phép bạn thực thi SQL gốc, ánh xạ kết quả theo thông số kỹ thuật của bạn. Một đặc tả như vậy mô tả cách một tập kết quả SQL được ánh xạ tới một kết quả Doctrine được biểu diễn bằng một ResultSetMapping.
Nguồn: SQL gốc .
Tôi đã từng gặp vấn đề tương tự. Bạn muốn xem đối tượng kết nối do trình quản lý thực thể cung cấp:
$conn = $em->getConnection();
Sau đó, bạn có thể truy vấn / thực thi trực tiếp chống lại nó:
$statement = $conn->query('select foo from bar');
$num_rows_effected = $conn->exec('update bar set foo=1');
Xem tài liệu cho đối tượng kết nối tại http://www.doctrine-project.org/api/dbal/2.0/doctrine/dbal/connection.html
Trong mô hình của bạn, hãy tạo câu lệnh SQL thô (ví dụ dưới đây là ví dụ về khoảng ngày mà tôi phải sử dụng nhưng thay thế của riêng bạn. Nếu bạn đang thực hiện thêm SELECT -> fetchall () vào lệnh thực thi ().
$sql = "DELETE FROM tmp
WHERE lastedit + INTERVAL '5 minute' < NOW() ";
$stmt = $this->getServiceLocator()
->get('Doctrine\ORM\EntityManager')
->getConnection()
->prepare($sql);
$stmt->execute();
Bạn không thể, Doctrine 2 không cho phép các truy vấn thô. Có vẻ như bạn có thể làm được nhưng nếu bạn thử một cái gì đó như thế này:
$sql = "SELECT DATE_FORMAT(whatever.createdAt, '%Y-%m-%d') FORM whatever...";
$em = $this->getDoctrine()->getManager();
$em->getConnection()->exec($sql);
Doctrine sẽ đưa ra lỗi nói rằng DATE_FORMAT là một hàm không xác định.
Nhưng cơ sở dữ liệu của tôi (mysql) không biết chức năng đó, vì vậy về cơ bản điều gây khó khăn là Doctrine đang phân tích cú pháp truy vấn đó đằng sau hậu trường (và sau lưng bạn) và tìm ra một biểu thức mà nó không hiểu, coi truy vấn đó là không hợp lệ.
Vì vậy, nếu giống như tôi, bạn muốn có thể đơn giản gửi một chuỗi đến cơ sở dữ liệu và để nó xử lý (và để nhà phát triển chịu hoàn toàn trách nhiệm về bảo mật), hãy quên nó đi.
Tất nhiên bạn có thể viết mã một tiện ích mở rộng để cho phép điều đó theo cách này hay cách khác, nhưng bạn cũng nên sử dụng mysqli để làm điều đó và để Doctrine cho nó ORM buisness.
mysqldump
hoặc tải dữ liệu từ các lần kết xuất trước đó hoặc giảm các bảng, tôi thường viết một tập lệnh shell cho công việc đó và sau đó viết một tác vụ (hoặc "lệnh", bằng ngôn ngữ Symfony2 ) thực thi tập lệnh shell. Mục đích của ORM, như tôi hiểu, là để loại bỏ những công việc lặp đi lặp lại và nếu bạn đang làm việc gì đó như cắt bớt một bảng, tôi không hiểu việc đưa Doctrine vào bức tranh sẽ có ý nghĩa như thế nào vì Doctrine không ' t làm cho nhiệm vụ đó dễ dàng hơn.