ฉันต้องการเรียกใช้ SQL ดิบโดยใช้หลักคำสอน 2
ฉันต้องการตัดทอนตารางฐานข้อมูลและเริ่มต้นตารางด้วยข้อมูลทดสอบเริ่มต้น
ฉันต้องการเรียกใช้ SQL ดิบโดยใช้หลักคำสอน 2
ฉันต้องการตัดทอนตารางฐานข้อมูลและเริ่มต้นตารางด้วยข้อมูลทดสอบเริ่มต้น
คำตอบ:
นี่คือตัวอย่างแบบสอบถามดิบในหลักคำสอน 2 ที่ฉันกำลังทำ:
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);
และไม่ต้องวิ่ง$stmt->execute();
EntityManagerInterface $entityManager
แล้วโทร$entityManager->getConnection()
//$sql - sql statement
//$em - entity manager
$em->getConnection()->exec( $sql );
ฉันทำให้มันทำงานได้โดยการทำเช่นนี้สมมติว่าคุณใช้ 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);
คุณสามารถเปลี่ยน FETCH_TYPE ให้เหมาะกับความต้องการของคุณ
เชื่อมต่อกับผู้จัดการของคุณและทำการเชื่อมต่อใหม่:
$manager = $this->getDoctrine()->getManager();
$conn = $manager->getConnection();
สร้างแบบสอบถามของคุณและดึงข้อมูลทั้งหมด:
$result= $conn->query('select foobar from mytable')->fetchAll();
รับข้อมูลจากผลลัพธ์ดังนี้:
$this->appendStringToFile("first row foobar is: " . $result[0]['foobar']);
ฉันพบว่าคำตอบน่าจะเป็น:
NativeQuery ช่วยให้คุณสามารถเรียกใช้ SQL แบบเนทีฟโดยทำแผนที่ผลลัพธ์ตามข้อกำหนดของคุณ ข้อกำหนดดังกล่าวที่อธิบายถึงวิธีการแมปชุดผลลัพธ์ SQL กับผลลัพธ์หลักคำสอนโดย ResultSetMapping
ที่มา: พื้นเมือง SQL
ผมมีปัญหาเหมือนกัน. คุณต้องการดูออบเจ็กต์การเชื่อมต่อที่จัดทำโดยผู้จัดการเอนทิตี:
$conn = $em->getConnection();
จากนั้นคุณสามารถสอบถาม / ดำเนินการโดยตรงกับมัน:
$statement = $conn->query('select foo from bar');
$num_rows_effected = $conn->exec('update bar set foo=1');
ดูเอกสารสำหรับวัตถุการเชื่อมต่อที่http://www.doctrine-project.org/api/dbal/2.0/doctrine/dbal/connection.html
ในโมเดลของคุณให้สร้างคำสั่ง SQL ดิบ (ตัวอย่างด้านล่างเป็นตัวอย่างของช่วงวันที่ที่ฉันต้องใช้ แต่แทนที่ของคุณเองหากคุณกำลังทำการ SELECT add -> fetchall () ไปยังการเรียก execute ()
$sql = "DELETE FROM tmp
WHERE lastedit + INTERVAL '5 minute' < NOW() ";
$stmt = $this->getServiceLocator()
->get('Doctrine\ORM\EntityManager')
->getConnection()
->prepare($sql);
$stmt->execute();
คุณทำไม่ได้หลักคำสอน 2 ไม่อนุญาตให้มีการสืบค้นข้อมูลดิบ อาจดูเหมือนว่าคุณทำได้ แต่ถ้าคุณลองทำสิ่งนี้:
$sql = "SELECT DATE_FORMAT(whatever.createdAt, '%Y-%m-%d') FORM whatever...";
$em = $this->getDoctrine()->getManager();
$em->getConnection()->exec($sql);
Doctrine จะพ่นข้อผิดพลาดที่บอกว่า DATE_FORMAT เป็นฟังก์ชันที่ไม่รู้จัก
แต่ฐานข้อมูลของฉัน (mysql) รู้จักฟังก์ชันนั้นดังนั้นโดยพื้นฐานแล้วสิ่งที่ทำให้เกิดความคาดหวังคือ Doctrine กำลังแยกวิเคราะห์แบบสอบถามนั้นเบื้องหลัง (และอยู่ด้านหลังของคุณ) และค้นหานิพจน์ที่ไม่เข้าใจโดยพิจารณาว่าแบบสอบถามไม่ถูกต้อง
ดังนั้นหากชอบฉันคุณต้องการเพียงแค่ส่งสตริงไปยังฐานข้อมูลและปล่อยให้มันจัดการกับมัน (และให้นักพัฒนารับผิดชอบต่อความปลอดภัยอย่างเต็มที่) ก็อย่าลืมไป
แน่นอนคุณสามารถเขียนโค้ดส่วนขยายเพื่อให้อนุญาตได้ไม่ทางใดก็ทางหนึ่ง แต่คุณก็สามารถใช้ mysqli ในการทำเช่นนั้นได้เช่นกันและออกจาก Doctrine ไปที่ ORM buisness
mysqldump
s หรือโหลดข้อมูลจากการทิ้งหรือวางตารางก่อนหน้านี้ฉันมักจะเขียนเชลล์สคริปต์สำหรับงานนั้นแล้วเขียนงาน (หรือ "คำสั่ง" ในภาษา Symfony2 ) ที่รันเชลล์สคริปต์ ตามที่ฉันเข้าใจจุดประสงค์ของ ORM คือการทำให้งานที่ซ้ำซากเป็นนามธรรมออกไปและถ้าคุณกำลังทำอะไรบางอย่างเช่นการตัดทอนตารางฉันไม่เห็นว่ามันจะสมเหตุสมผลอย่างไรที่จะนำหลักคำสอนเข้ามาในภาพเนื่องจาก Doctrine ไม่ ' ไม่ทำให้งานนั้นง่ายขึ้น