อัพเดตฟิลด์อ้างอิงเอนทิตีโดยทางโปรแกรม


23

ฉันรู้ว่าฉันสามารถอัปเดต (หรือตั้งค่าสำหรับ) ฟิลด์การอ้างอิงเอนทิตีใน Drupal 7 ด้วยรหัสที่คล้ายกับต่อไปนี้

 $node['field_code_used_by'][LANGUAGE_NONE][0]['target_id'] = $id;

ฉันต้องการตั้งค่าโปรแกรมสำหรับเขตข้อมูลการอ้างอิงเอนทิตีผู้ใช้ของฉันใน Drupal 8

ฉันพยายามด้วย$node->field_code_used_by->setValue(1);และ$node->field_code_used_by->entity->value = 1;แต่ไม่ใช่ของพวกเขาทำงาน

ฉันจะตั้งค่าสำหรับเขตข้อมูลอ้างอิงเอนทิตีได้อย่างไร

คำตอบ:


31

คุณต้องใช้รหัสที่คล้ายกับดังต่อไปนี้

    $node = Node::load($nid);     
    $node->field_code_used_by->target_id = $user_id;
    $node->save();

สำหรับฟิลด์ที่มีหลายค่าเมื่อต้องการเพิ่มค่าลงในส่วนท้ายของรายการให้ใช้รหัสต่อไปนี้

$node->field_code_used_by[] = ['target_id' => $user_id];

อีกวิธีหนึ่งคือการตั้งค่าentityคุณสมบัติด้วยวัตถุเอนทิตีเช่นเดียวกับในรหัสต่อไปนี้

    $node = Node::load($nid);
    $user = \Drupal\user\Entity\User::load(1);
    $node->field_code_used_by->entity = $user;
    $node->save();

2
สิ่งนี้ดูเหมือนจะไม่ทำงานเว้นแต่ว่าโหนดหลักนั้นมีอยู่แล้ว เมื่อกำหนดคุณสมบัติ target_id หรือเอนทิตีให้กับโหนดพาเรนต์ใหม่ที่ยังไม่ได้บันทึกความสัมพันธ์จะไม่ถูกบันทึก (อาจเป็นไปไม่ได้เมื่อกำหนดให้กับเขตข้อมูลอ้างอิงเอนทิตี้ NULL แต่ฉันยังไม่ได้ทดสอบ) ใครรู้วิธีแก้ไขกรณีนี้
aaronbauman

@aaronbauman คุณมีวิธีแก้ไขไหม?
echo

@echo ฉันจำไม่ได้ว่าฉันจะหลีกเลี่ยงหรืออย่างไร หากคำอธิบายพฤติกรรมของฉันถูกต้องนี่เป็นข้อผิดพลาด หากไม่มีปัญหาแบบเปิดใน drupal.org ควรมี
aaronbauman

@aaronbauman drupal.org/project/paragraphs/issues/2707017#comment-11872624ช่วยให้ฉันทำงานกับโหนดใหม่ได้ ดังนั้นดูเหมือนจะไม่เป็นข้อผิดพลาด
สะท้อน

11

เช่นเดียวกับ D7 คุณสมบัติหลักของเขตข้อมูลอ้างอิงใน D8 ยังคงเป็นtarget id:

$node->field_code_used_by->target_id = $user_id;

entityคุณสมบัติเป็นค่าที่คำนวณ หากคุณใส่วัตถุในค่านี้ drupal จะแปลงกลับเป็นรหัสก่อนที่จะบันทึกลงใน dababase

เขตข้อมูลหลายค่า

เพิ่มรายการไปยังเขตข้อมูลหลายค่า:

$node->field_code_used_by[] = ['target_id' => $user_id];

คุณสมบัติtarget_idไม่จำเป็นเนื่องจากเป็นคุณสมบัติหลักและใช้เป็นค่าเริ่มต้น ดังนั้นสำหรับฟิลด์ส่วนใหญ่คุณสามารถเพิ่มค่าเช่นเดียวกับใน PHP php แบบง่าย ๆ ซึ่งง่ายต่อการจดจำ:

$node->field_code_used_by[] = $user_id;

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