Jawaban:
Berikut adalah contoh kueri mentah di Doktrin 2 yang saya lakukan:
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);
dan tidak harus lari$stmt->execute();
EntityManagerInterface $entityManager
dan kemudian menelepon$entityManager->getConnection()
//$sql - sql statement
//$em - entity manager
$em->getConnection()->exec( $sql );
Saya membuatnya bekerja dengan melakukan ini, dengan asumsi Anda menggunakan 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);
Anda dapat mengubah FETCH_TYPE sesuai dengan kebutuhan Anda.
Hubungkan ke manajer Anda dan buat koneksi baru:
$manager = $this->getDoctrine()->getManager();
$conn = $manager->getConnection();
Buat kueri Anda dan fetchAll:
$result= $conn->query('select foobar from mytable')->fetchAll();
Dapatkan data dari hasil seperti ini:
$this->appendStringToFile("first row foobar is: " . $result[0]['foobar']);
Saya menemukan jawabannya mungkin:
NativeQuery memungkinkan Anda menjalankan SQL asli, memetakan hasil sesuai dengan spesifikasi Anda. Spesifikasi yang menjelaskan bagaimana kumpulan hasil SQL dipetakan ke hasil Doktrin diwakili oleh ResultSetMapping.
Sumber: SQL Asli .
Saya memiliki masalah yang sama. Anda ingin melihat objek koneksi yang disediakan oleh manajer entitas:
$conn = $em->getConnection();
Anda kemudian dapat meminta / mengeksekusi secara langsung terhadapnya:
$statement = $conn->query('select foo from bar');
$num_rows_effected = $conn->exec('update bar set foo=1');
Lihat dokumen untuk objek koneksi di http://www.doctrine-project.org/api/dbal/2.0/doctrine/dbal/connection.html
Dalam model Anda, buat pernyataan SQL mentah (contoh di bawah ini adalah contoh dari interval tanggal yang harus saya gunakan tetapi gantikan milik Anda sendiri. Jika Anda melakukan panggilan SELECT add -> fetchall () ke execute ().
$sql = "DELETE FROM tmp
WHERE lastedit + INTERVAL '5 minute' < NOW() ";
$stmt = $this->getServiceLocator()
->get('Doctrine\ORM\EntityManager')
->getConnection()
->prepare($sql);
$stmt->execute();
Anda tidak bisa, Doktrin 2 tidak mengizinkan kueri mentah. Sepertinya Anda bisa tetapi jika Anda mencoba sesuatu seperti ini:
$sql = "SELECT DATE_FORMAT(whatever.createdAt, '%Y-%m-%d') FORM whatever...";
$em = $this->getDoctrine()->getManager();
$em->getConnection()->exec($sql);
Doktrin akan mengeluarkan kesalahan yang mengatakan bahwa DATE_FORMAT adalah fungsi yang tidak diketahui.
Tapi database saya (mysql) tahu fungsi itu, jadi pada dasarnya apa yang terjadi adalah Doctrine sedang mem-parsing kueri itu di belakang layar (dan di belakang Anda) dan menemukan ekspresi yang tidak dipahami, menganggap kueri itu tidak valid.
Jadi jika seperti saya Anda ingin dapat mengirim string ke database dan membiarkannya menanganinya (dan biarkan pengembang bertanggung jawab penuh atas keamanan), lupakan saja.
Tentu saja Anda dapat membuat kode ekstensi untuk mengizinkannya dalam beberapa cara atau yang lain, tetapi Anda sebaiknya menggunakan mysqli untuk melakukannya dan meninggalkan Doctrine untuk bisnis ORM itu.
mysqldump
s atau memuat data dari dump sebelumnya atau menjatuhkan tabel, saya biasanya menulis skrip shell untuk pekerjaan itu dan kemudian menulis tugas (atau "perintah", dalam bahasa Symfony2 ) yang menjalankan skrip shell. Tujuan dari ORM, seperti yang saya pahami, adalah untuk mengabstraksi pekerjaan berulang, dan jika Anda melakukan sesuatu seperti memotong tabel, saya tidak melihat bagaimana masuk akal untuk membawa Ajaran ke dalam gambar karena Ajaran tidak melakukannya t membuat tugas itu lebih mudah.