Score:1

เผยแพร่โหนดที่ไม่ได้เผยแพร่โดยทางโปรแกรม

ธง in

ฉันต้องการเผยแพร่โหนดที่ไม่ได้เผยแพร่ในการดำเนินการที่กำหนดเอง ในการทำเช่นนี้ ฉันสอบถามฐานข้อมูลตามเงื่อนไขเฉพาะ และต้องการใช้เงื่อนไข 'มีอยู่' เพื่อค้นหารหัสโหนดที่จะเผยแพร่ นี่คือรหัสที่ฉันใช้

$query = \Drupal::entityQuery('โหนด');

foreach($i_selected as $is) {
  $nids = $query->andConditionGroup()
    ->เงื่อนไข ('ประเภท', 'ระดับ 3')
    ->เงื่อนไข('ชื่อ', $file_name)
    ->เงื่อนไข ('สถานะ', '0')
    -> มีอยู่ ('นิด')
    ->ดำเนินการ ();

  $nids->setPublished(จริง)->บันทึก();
}

ฉันได้รับข้อผิดพลาดนี้

ข้อผิดพลาด: การเรียกไปยังเมธอดที่ไม่ได้กำหนด Drupal\Core\Entity\Query\Sql\Condition::execute()

แบบสอบถาม SQL ที่ฉันพยายามบรรลุคือ:

   เลือก nid, สถานะ, ชื่อเรื่องจาก node_field_data โดยที่สถานะ = '0' และชื่อ = $filename

จากผลลัพธ์ ฉันต้องการดูว่ามีนิดส์อยู่หรือไม่ และเผยแพร่นิดส์เหล่านั้น

ฉันจะแก้ไขข้อผิดพลาดนั้นได้อย่างไร

apaderno avatar
us flag
เมื่อตอบคำถามแล้ว คุณไม่สามารถเปลี่ยนแปลงได้ แม้กระทั่งเพิ่มการอัปเดตตามคำตอบที่ได้รับ คำถามไม่กลับไปกลับมากับผู้ใช้ที่ตอบ
Jiah avatar
in flag
ฉันตรวจสอบคำตอบของคุณหลังจากที่ฉันรู้แล้วเท่านั้น ฉันจะตรวจสอบให้แน่ใจว่าจะไม่อัปเดตคำถาม ขอบคุณสำหรับการสนับสนุน :)
Score:3
ธง us

รหัสกำลังโทร ดำเนินการ () บนวัตถุที่ส่งคืนจาก $query->andConditionGroup()แต่วัตถุนั้นไม่ได้ใช้งานใด ๆ ดำเนินการ () กระบวนการ.

วิธีการใช้งานที่ถูกต้อง andConditionGroup() แสดงอยู่ใน QueryBase::andConditionGroup().

$query = \Drupal::entityQuery('รูปวาด');
$group = $query->andConditionGroup()
  ->เงื่อนไข('ตัวเลขสี', 'สีแดง')
  ->condition('figures.shape', 'triangle');
$query->condition($group);
$group = $query->andConditionGroup()
  ->เงื่อนไข('ตัวเลขสี', 'สีน้ำเงิน')
  ->condition('figures.shape', 'circle');
$query->condition($group);
$entity_ids = $query->execute();

ในกรณีของคุณ ใช้ andConditionGroup() ไม่จำเป็น เนื่องจากการสืบค้นที่ดำเนินการโดยรหัสนั้นส่งคืนโหนดทั้งหมดที่:

  • ประเภทเนื้อหาคือ ระดับ 3
  • ชื่อเรื่องคือ $file_name
  • สถานะเป็น 0

ไม่ส่งคืนโหนดทั้งหมดที่มีเงื่อนไขอย่างน้อยหนึ่งข้อที่เป็นจริง คล้ายกับการทำงานของโค้ดต่อไปนี้ ซึ่งจะคืนค่าทั้งหมด หน้าหนังสือ โหนดที่มีค่าของ field_some_field สูงกว่า 14

$query = \Drupal::entityQuery('โหนด')
  ->เงื่อนไข ('ประเภท', 'หน้า')
  ->เงื่อนไข ('field_some_field', 14, '>');
$results = $query->execute();

$query->execute() ส่งคืนอาร์เรย์ของรหัสเอนทิตี ไม่ใช่เอนทิตีหรืออาร์เรย์ของเอนทิตี $nids = $query->execute(); $nids->setPublished(จริง)->บันทึก(); ยังคงผิดเนื่องจากอาร์เรย์ไม่ได้ใช้ setPublished() กระบวนการ.
กำหนดอาร์เรย์ของโหนด ID $นิดส์รหัสที่ถูกต้องในการโหลดโหนดคือรหัสต่อไปนี้

$nodes = \Drupal::entityTypeManager()->getStorage('node')->loadMultiple(array_values($nids));

$โหนด จะมีอาร์เรย์ของเอนทิตี การเผยแพร่สามารถทำได้โดยใช้รหัสต่อไปนี้

foreach ($ โหนดเป็น $ โหนด) {
  $node->setPublished(TRUE)->save();
}

วัตถุที่ส่งคืนจาก \Drupal::entityQuery() ตรวจสอบว่าผู้ใช้ที่เข้าสู่ระบบในปัจจุบันมีสิทธิ์ดูโหนดที่ส่งคืน ในกรณีส่วนใหญ่ ผู้ใช้ไม่มีสิทธิ์เข้าถึงโหนดที่ไม่ได้เผยแพร่ เพื่อหลีกเลี่ยงไม่ให้เคียวรีแสดงเฉพาะโหนดที่ผู้ใช้ที่ล็อกอินอยู่ในปัจจุบันสามารถดูได้ จำเป็นต้องเรียก $query->accessCheck(เท็จ)เช่นเดียวกับใน $query = \Drupal::entityQuery('โหนด')->checkAccess(FALSE);

นอกจากนี้ มีอยู่ ('นิด') การโทรไม่จำเป็น เนื่องจาก ID โหนดจะถูกบันทึกไว้สำหรับโหนดเสมอ

ออกจากลูปบน $i_selectedรหัสที่ฉันจะใช้คือรหัสต่อไปนี้

$query = \Drupal::entityQuery('โหนด')->checkAccess(FALSE);

$nids = $query->condition('ประเภท', 'level3')
  ->เงื่อนไข('ชื่อ', $file_name)
  ->เงื่อนไข ('สถานะ', '0')
  ->ดำเนินการ ();

$nodes = \Drupal::entityTypeManager()->getStorage('node')->loadMultiple(array_values($nids));

foreach ($ โหนดเป็น $ โหนด) {
  $node->setPublished(TRUE)->save();
}

โพสต์คำตอบ

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