เงื่อนไขการนับความสัมพันธ์ใน WhereHas Laravel คืออะไร

ฉันประสบปัญหาในการทำความเข้าใจเงื่อนไขการนับความสัมพันธ์ใน WhereHas หน้าเอกสารไม่มีการพูดคุยถึงเรื่องนี้ แต่หน้า API พูดถึงเรื่องนี้ อ้างอิงจาก API

Builder|Builder โดยที่ (สตริง $relation, ปิด $callback, string $operator = '>=', int $count = 1)

เพิ่มเงื่อนไขการนับความสัมพันธ์ให้กับแบบสอบถามด้วยคำสั่ง Where

ตัวอย่าง

A Resource โมเดลมีความสัมพันธ์แบบหลายต่อมากกับ ResourceCategory

public function categories()
{
    return $this->belongsToMany('ResourceCategory', 'resource_category_mapping');
}

เงื่อนไขความสัมพันธ์ใน Has

เงื่อนไขความสัมพันธ์ใน Has ทำงานตามที่คาดไว้

Resource::has('categories', '>', 1)->get()
//this return all resources which have more than one catgories

เงื่อนไขความสัมพันธ์ใน WhereHas

เงื่อนไขความสัมพันธ์ใน WhereHas ไม่ทำงานตามที่คาดไว้ ฉันแน่ใจว่าฉันเข้าใจผิด

Resource::whereHas('categories', function ( $query){
            $query->whereIn('resource_category_id', [1, 2, 4]);
        }, '>', 1)->get()

รหัสข้างต้นควรส่งคืนทรัพยากรที่มีหมวดหมู่เป็นของ [1, 2, 4] และทรัพยากรมีมากกว่าหนึ่งหมวดหมู่ แต่มันไม่ใช่

คำถาม

กรุณาอธิบายเงื่อนไขความสัมพันธ์ใน WhereHas อาจยกตัวอย่างมาด้วยจะเป็นประโยชน์มาก


person hhsadiq    schedule 25.07.2015    source แหล่งที่มา


คำตอบ (1)


โดยปกติ whereHas() จะตรวจสอบว่าโมเดลของคุณมีโมเดลที่เกี่ยวข้อง อย่างน้อยหนึ่ง หรือไม่ คุณสามารถตั้งค่า $count เป็นค่าที่สูงกว่าเพื่อเพิ่มจำนวนเป็น N และดึงเฉพาะโมเดลที่มีโมเดลที่เกี่ยวข้องอย่างน้อย N

ในกรณีของคุณโทร

Resource::has('categories', '>', 2)->get();

จะส่งกลับเฉพาะ ทรัพยากร ที่มี อย่างน้อย 2 หมวดหมู่ที่เกี่ยวข้อง

person jedrzej.kurylo    schedule 25.07.2015
comment
คุณสามารถตรวจสอบคำอธิบายของฉันเกี่ยวกับโค้ด WhereHas ของฉัน 'โค้ดด้านบนควรส่งคืนทรัพยากรซึ่งมีหมวดหมู่เป็นของ [1, 2, 4] และทรัพยากรมีมากกว่าหนึ่งหมวดหมู่' นั่นถูกต้องใช่ไหม...? - person hhsadiq; 25.07.2015
comment
ใช้งานได้สำหรับฉัน โปรดวางแบบสอบถามที่คุณได้รับ - แทนที่ get() ด้วย toSql() - แล้ววางที่นี่ - person jedrzej.kurylo; 25.07.2015
comment
เลือก * จาก resource โดยที่ resource.deleted_at เป็นโมฆะ และ first_name = ? และ (เลือกจำนวน(*) จาก resource_category เข้าร่วมภายใน resource_category_mapping บน resource_category.id = resource_category_mapping.resource_category_id โดยที่ resource_category_mapping.resource_id = resource.id และ resource_category_id ใน (?, ?, ?, ?)) = 3 - person hhsadiq; 25.07.2015
comment
นั่น =3 มาจากไหน? คุณเพิ่มสิ่งนี้หรือเปล่า? แบบสอบถามดูโอเคนอกเหนือจากนี้ - person jedrzej.kurylo; 25.07.2015
comment
ขออภัย ฉันแค่กำลังแก้ไขโค้ด คุณสามารถแทนที่ด้วย › 1 - person hhsadiq; 25.07.2015
comment
อย่างที่บอกไปแล้วว่าข้อความค้นหาดูใช้ได้ คุณแน่ใจหรือไม่ว่าคุณมีข้อมูลที่ถูกต้อง คุณมีบันทึกที่ตรงกับเงื่อนไขข้างต้นหรือไม่? - person jedrzej.kurylo; 25.07.2015
comment
โอเค ตอนนี้ฉันเข้าใจแล้ว มันทำงานได้อย่างสมบูรณ์แบบ จริงๆ แล้วฉันมีช่วงเวลาที่ยากลำบากในการทำความเข้าใจการทำงานของการนับความสัมพันธ์กับ WhereHas ฉันได้ทดสอบหลายกรณีและเล่นกับมันมาระยะหนึ่งแล้ว และตอนนี้ฉันก็เข้าใจแล้ว ขอบคุณมากสำหรับความช่วยเหลือของคุณ - person hhsadiq; 25.07.2015
comment
วันนี้ฉันค้นหาสิ่งนี้ทั้งวัน ขอบคุณที่ยังคงมีประโยชน์หลังจากผ่านไป 3 ปี :) - person Wasif Khalil; 08.09.2018
comment
สิ่งนี้แขวนคอสำหรับฉัน มีผลลัพธ์ 2K ฉันสงสัยว่ามันเกี่ยวข้องกับมันหรือไม่ นี่เป็นวิธีแก้ปัญหาที่ฉันต้องการ - person Harry Bosh; 26.08.2020