เลือกเขตข้อมูลจากสองตารางโดยใช้ db_select ()


15

ฉันกำลังใช้db_select()และฉันไม่เข้าใจไวยากรณ์ของfields()วิธีการ ฉันกำลังใช้join()เพื่อเข้าร่วมตารางอื่น ดังนั้นสำหรับตารางtและnฉันต้องการทำอะไรเช่น

SELECT t.tid, t.field1, t.field2, n.title, n.author 
FROM table t INNER JOIN node n ON t.nid = n.nid;

ฉันมี

$results = db_select('table', 't')
  ->fields( ... )
  ->join('node', 'n', 'n.nid = t.nid')
  ->execute();

แต่อย่างที่คุณเห็นฉันหลงfields()ทาง ตัวอย่างที่ฉันเห็นเฉพาะระบุเขตข้อมูลสำหรับหนึ่งตาราง:

->fields('t', array('tid', 'field1', 'field2'))

ไวยากรณ์ที่ฉันต้องการใช้คืออะไร

คำตอบ:


28

ง่ายเพียงแค่เรียกเขตข้อมูล () สองครั้ง

$query = db_select('table', 't');
$query->join('node', 'n', 'n.nid = t.nid');
$result = $query
  ->fields('t', array('tid', 'field1', 'field2'))
  ->fields('n', array('nid', 'field1', 'field2'))
  ->execute();

foreach ($result as $row) {
  // Do something with $row.
}

คุณสามารถเรียกวิธีการส่วนใหญ่ได้หลายครั้ง (หลายเขตข้อมูล, หลายเงื่อนไข, เรียงลำดับการจัดเรียงหลายครั้ง, เข้าร่วมหลายครั้ง, ... )

โปรดทราบว่าดังที่แสดงในตัวอย่างของฉันการเรียกเพื่อเข้าร่วม () ต้องแยกจากกันและไม่สามารถ "ถูกผูกมัด" (นั่นเป็นคำศัพท์ทางเทคนิคสำหรับการเรียกวิธีการหลายวิธีในแถว) เนื่องจากไม่ได้ส่งคืนวัตถุแบบสอบถาม แต่ ชื่อสำหรับนามแฝงของตาราง


2

การเข้าร่วมโดยนัยจะยังคงทำงานกับ db_query () หากคุณไม่ได้ทำอะไรแฟนซี ฉันไม่แน่ใจว่านี่เป็นการปฏิบัติที่ไม่ดีหรือไม่ ฉันถาม IRC หนึ่งครั้งและไม่ได้รับคำตอบจากใคร ดังนั้นหากคุณมีสิ่งที่เหลืออยู่จาก D6 พวกเขาจะยังคงใช้งานได้


3
การใช้ db_query () นั้นใช้ได้อย่างสมบูรณ์แบบ (แนะนำจริงๆสำหรับเหตุผลด้านประสิทธิภาพ) เว้นแต่จะมีเหตุผลที่ชัดเจนสำหรับการใช้ db_select () ฉันได้อธิบายเหตุผลเหล่านี้ไว้ที่นี่: drupal.stackexchange.com/questions/1200/…
Berdir

ที่ดี! ฉันขี้เกียจเกินไปที่จะเปลี่ยนใจ ;)
colan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.