Score:2

จะใช้ค่าของเอนทิตีที่อ้างอิงใน TableSort ได้อย่างไร

ธง ai

ฉันมีเอนทิตีแบบกำหนดเองพร้อมฟิลด์ที่กำหนดดังนี้

$fields['file'] = BaseFieldDefinition::create('ไฟล์')
  ->setDescription('อ้างอิงถึงประเภทเอนทิตีไฟล์หลักในตัว')
  ->setLabel('ไฟล์')
  -> setRequired (จริง)
  ->setSetting('file_extensions', 'pdf rtf doc docx')
  ->setSetting('max_filesize', '20MB')
  ->setSetting('description_field', จริง)
  ->setDisplayOptions('รูปแบบ', ['ประเภท' => 'ไฟล์'])
  ->setDisplayOptions('ดู', ['ประเภท' => 'ไฟล์']);

ฉันไม่มีปัญหาในการไปที่ฟิลด์ของการอ้างอิง ไฟล์ เอนทิตีจากอินสแตนซ์ประเภทเอนทิตีของฉันเอง ตัวอย่างเช่น เส้นเหล่านี้ทำงานตามที่คาดไว้

$filename = $my_entity->file->entity->ชื่อไฟล์->value;
$ชื่อผู้ใช้ = $my_entity->file->entity->uid->entity->name->value;

เมื่อฉันพยายามใช้ฟิลด์ของการอ้างอิง ไฟล์ เอนทิตีกับ จัดเรียงตารางซึ่งฉันต้องการเสียบเข้ากับแบบสอบถามเอนทิตีในประเภทเอนทิตีที่กำหนดเองของฉัน โค้ดแสดงข้อยกเว้น

$ส่วนหัว['ชื่อ'] = [
  'data' => 'ชื่อไฟล์',
  'field' => 'file.entity.filename',
  'specifier' => 'file.entity.filename',
];
$ส่วนหัว['ผู้ใช้'] = [
  'data' => 'อัปโหลดโดย',
  'field' => 'file.entity.uid.entity.name',
  'ตัวระบุ' => 'ไฟล์.entity.uid.entity.name',
];

// â¦

$query->tableSort($ส่วนหัว);

Uncaught ข้อยกเว้น PHP Drupal\Core\Entity\Query\QueryException: "ไม่พบ 'ไฟล์'"

สำหรับไวยากรณ์ของ $ส่วนหัว อาร์เรย์ฉันอาศัยเบาะแสที่ฉันได้รับเป็นส่วนใหญ่ จัดเรียงตารางด้วย EntityQueryซึ่งเบอร์เดียร์แนะนำให้เราดูที่ โหลด () และ สร้างส่วนหัว () วิธีการของ ตัวสร้างรายการผู้ใช้ ระดับ. น่าเสียดายที่ตัวอย่างนั้นดูเหมือนจะใช้ค่าฟิลด์ซึ่งจัดเก็บโดยตรงในตารางฐาน ดังนั้นฉันจึงถอยกลับไปใช้สมมติฐานที่ว่า เนื่องจากเราอยู่ในพื้นที่คิวรีของเอนทิตี ไวยากรณ์เดียวกันที่อธิบายไว้ใน QueryInterface::condition() คาดว่าจะ

ฉันได้ดูประเด็นที่เปิดอยู่จำนวนหนึ่งเช่น การจัดเรียงตารางละเว้น "เขตข้อมูล" เพิ่มชื่อส่วนหัวเป็นพารามิเตอร์การค้นหาคำสั่งซื้อเสมอ และ การล้างข้อมูลแบบเรียงตารางแต่ฉันไม่เห็นสิ่งใดที่ให้ความกระจ่างเกี่ยวกับปัญหา

cn flag
รองรับไวยากรณ์ที่คุณใช้อย่างแน่นอน เนื่องจากวิธีนี้ใช้ได้ดีกับโหนดที่ใช้เช่น `uid.entity.name` เป็นตัวระบุ คุณมีปัญหาในการติดตั้งฟิลด์ไฟล์นี้หรือไม่? หรืออาจเปลี่ยนหลังจากติดตั้ง? เปลี่ยน cardinality อะไรแบบนั้น?
ai flag
@Clive - ไม่มีปัญหาในการติดตั้งฟิลด์ และไม่มีการปรับเปลี่ยนใดๆ กับคอนฟิกูเรชัน ฉันสามารถเติมฟิลด์ได้อย่างสมบูรณ์แบบเมื่อสร้างหรืออัปเดตเอนทิตี และสามารถเข้าถึงคุณสมบัติของฟิลด์ใดๆ โดยใช้ไวยากรณ์การเข้าถึงฟิลด์เอนทิตีมาตรฐาน ฉันควรยื่นรายงานจุดบกพร่อง (พร้อมกรณีจำลอง) คุณคิดว่า?
cn flag
ฉันไม่แน่ใจว่ามันเป็นบั๊กหรือแค่บางอย่างที่ไม่มีเอกสาร มีไวยากรณ์ที่ใช้ได้กับฟิลด์ไฟล์ฐาน ฉันใส่คำตอบแล้ว แต่ฉันหวังว่าจะอัปเดตเมื่อมีเวลาเพื่อหาข้อมูลเพิ่มเติม
ai flag
@Clive - ก่อนอื่นฉัน _very_ ประทับใจที่คุณคิดออก ฉันได้อัปเดต [รายงานข้อผิดพลาด](https://www.drupal.org/project/drupal/issues/3278083) เพื่อให้สอดคล้องกับข้อมูลใหม่นี้ เวอร์ชันย่อ: เป็นข้อผิดพลาดในเอกสารประกอบหรือซอฟต์แวร์ และฉันเชื่อว่ากรณีที่แข็งแกร่งกว่านั้นสามารถสร้างได้สำหรับการทำให้ซอฟต์แวร์สอดคล้องกับไวยากรณ์ที่จัดทำเอกสารในปัจจุบันสำหรับประเภทฟิลด์อ้างอิงหลัก _any_ ฉันยอมรับคำตอบที่ยอดเยี่ยมของคุณ ก่อนที่คุณจะมีโอกาสอัปเดตด้วยซ้ำ
Score:2
ธง cn

มีข้อบกพร่องในแกนหลัก และในขณะนี้วิธีแก้ปัญหาคือ:

'specifier' => 'file.target_id.entity.filename',

เหตุผลสำหรับสิ่งนี้คือไวยากรณ์ความสัมพันธ์ของคิวรีเอนทิตีที่เริ่มต้นจากการสนับสนุนการเข้าร่วม มันลงวันที่มาก่อนการสนับสนุนการอ้างอิงเอนทิตีในแกนหลักและในขณะเดียวกัน $entity->file->target_id->entity ไม่รองรับแกนหลัก ไฟล์.target_id.entity ได้รับการสนับสนุนโดยแบบสอบถามเอนทิตีเพื่อระบุว่าควรเข้าร่วมเอนทิตีที่ระบุโดย ไฟล์ ฟิลด์และรหัสเอนทิตีควรเป็นสิ่งที่ระบุโดย target_id. มันค่อนข้างเทอะทะ แต่ ณ เวลานั้น มันคือสิ่งที่ได้ผล

มัน ควร สามารถคิดออก file.entity.filename เช่นกันเนื่องจากชื่อคุณสมบัติหลักสำหรับ ไฟล์ สนามที่จะเกิดขึ้น target_id จึงสามารถต่อยอดให้คุณได้ file.target_id.entity.ชื่อไฟล์. อย่างไรก็ตามคลาสในกรณี Drupal\Core\Entity\Query\Sql\Tables มีความซับซ้อนอย่างมาก และส่วนขยายนี้มีข้อบกพร่องสำหรับกรณีตารางที่ใช้ร่วมกัน ซึ่งจะได้รับการแก้ไขใน https://www.drupal.org/project/drupal/issues/3278083

ai flag
So you're suggesting it's the documentation which needs to be fixed, not the code? Wouldn't be the first time.
ai flag
ฉันยอมรับคำตอบที่ยอดเยี่ยมของคุณ แม้ว่าฉันจะไม่แน่ใจว่าฉันเข้าใจสิ่งที่คุณหมายถึงในคำอธิบายของคุณฉันมีตัวอย่างเงื่อนไขการอ้างอิงเอนทิตีจำนวนนับไม่ถ้วนในการสืบค้นเอนทิตีซึ่งอาศัยฟิลด์อ้างอิงที่จัดเก็บไว้ในตารางฐาน และทำงานได้ดีกับไวยากรณ์ที่จัดทำเป็นเอกสาร
cn flag
ใช่ การอ้างอิงเอนทิตีวานิลลาเป็นฟิลด์ฐานดูเหมือนว่าจะทำงานตามที่คุณคาดหวัง หากฉันเป็นนักพนัน หากมองไม่ถูกต้อง อาจเป็นเพราะฟิลด์อ้างอิงเอนทิตีพื้นฐานมีคอลัมน์ฐานข้อมูลเพียงคอลัมน์เดียว (`target_id`) ดังนั้นจึงไม่จำเป็นต้องมีไวยากรณ์เพื่อรองรับ "ฟิลด์ย่อย "; คอลัมน์ `fieldname__target_id` สามารถอนุมานได้ (ฟิลด์ย่อยน่าจะไม่ใช่คำที่เป็นทางการ :) ) ฟิลด์ไฟล์มี 3 คอลัมน์ DB ดังนั้นข้อความค้นหาจำเป็นต้องบอกอย่างชัดเจนว่าคอลัมน์ `file__*` ใดในตารางฐานจำเป็นต้องใช้ ดังนั้นจึงเป็นไวยากรณ์อื่น ยังคงเป็นอย่างอื่นแม้ว่า
cn flag
พบมัน - `DefaultTableMapping::getFieldColumnName()` เป็นปืนสูบบุหรี่ ถ้าเขตข้อมูลมีเพียงหนึ่งคอลัมน์ ชื่อคอลัมน์ DB จะเป็นชื่อของเขตข้อมูล ดังนั้นฟิลด์อ้างอิงเอนทิตีที่มี ID เป็น `uid` จะมีคอลัมน์ DB ชื่อ `uid` เมื่อคุณค้นหา `uid.entity.*` มีชื่อคอลัมน์ DB ที่ตรงกันทุกประการ และทุกอย่างเรียบร้อยดี เมื่อฟิลด์มีมากกว่าหนึ่งคอลัมน์ คอลัมน์ DB จะมีชื่อว่า `fieldname__property_name` ดังนั้นเมื่อคุณค้นหา `fieldname.entity` จะไม่มีคอลัมน์ DB ของ `fieldname` ที่ตรงกัน มีไวยากรณ์เพิ่มเติมเพื่อเชื่อมช่องว่างนั้นและให้คุณเลือกคอลัมน์ที่ถูกต้อง
ai flag
ขอบคุณสำหรับการสะกดที่ยอดเยี่ยมนี้ ฉันจะรวมลิงก์ไปยังหน้านี้จากรายงานจุดบกพร่อง
Smartsheet eng avatar
um flag
นี่เป็นวิธีแก้ปัญหาที่ได้ผล แต่ไม่ใช่สาเหตุที่ทำให้ `fieldname.entity.propertyname` ไม่ทำงาน สาเหตุคือถ้า 1) ฟิลด์ที่มีหลายคอลัมน์ 2) ถูกจัดเก็บไว้ในตารางที่ใช้ร่วมกัน 3) และใช้ในแบบสอบถามโดยที่ตัวระบุตามชื่อฟิลด์ -- โค้ดการแมปตารางจะไม่ถูกเรียกใช้เลย มีข้อผิดพลาดในตาราง ฉันทิ้งคำตอบไว้และยื่นแพตช์ นอกจากนี้ "ระบบไม่ทราบว่าไฟล์คืออะไร" มันรู้แน่ว่าเป็นทุ่ง รหัสไม่ได้เรียก `$sql_column = $table_mapping->getFieldColumnName($field_storage, $column);` นี่เป็นกรณีขอบที่หายากมาก
cn flag
@Smartsheeteng อันที่จริง จุดบกพร่องอาจเป็นสาเหตุที่ _ระบบไม่รู้ว่าไฟล์คืออะไร_ ณ จุดนั้น (ซึ่งไม่มี การแมปตารางไม่มี `file` แต่มี `file__*`)
Smartsheet eng avatar
um flag
@Clive ระบบรู้ว่าไฟล์คืออะไร มันเป็นฟิลด์ คุณกำลังดูคลาสผิด ข้อผิดพลาดอยู่ใน Tables ไม่ใช่คลาสการแมป จุดบกพร่องคือคลาสนั้นไม่ได้ถูกเรียกตั้งแต่แรกสำหรับตัวระบุนี้ คำตอบนี้ผิดทั้งหมด ฉันจะแก้ไขและลบของฉันเพราะมันฟุ่มเฟือย
cn flag
@Smartsheeteng ฉันไม่รู้ว่าคุณเขียนโค้ดต้นฉบับ ยุติธรรมพอ แก้ไขคำตอบแล้ว
Score:1
ธง ai

ความล้มเหลวที่อธิบายข้างต้นเป็นผลมาจากก บั๊ก ใน ไฟล์รายการ เสียบเข้าไป. แม้ว่าปลั๊กอินประเภทฟิลด์ การเรียกร้อง เป็นการอ้างอิงเอนทิตี (the @ประเภทฟิลด์ คำอธิบายประกอบกล่าวว่า หมวดหมู่ = @การแปล("อ้างอิง")) และอื่น ๆ ทุกประการที่เป็นความจริง, การสนับสนุนสำหรับ ไวยากรณ์แบบสอบถามเอนทิตีที่เป็นเอกสาร หัก

จนกว่าจุดบกพร่องจะได้รับการแก้ไข วิธีแก้ไขคือยกเลิกความเชี่ยวชาญพิเศษที่ดำเนินการโดย ไฟล์รายการ ประเภทฟิลด์และใช้แบบธรรมดา เอนทิตี_reference สนามแทน ด้วยการเปลี่ยนแปลงนั้น จัดเรียงตาราง รหัสด้านบนทำงานได้อย่างถูกต้อง

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา