Yii2: ฉันจะเขียน Active Query ด้านล่างได้อย่างไร

เมื่อใช้โซลูชันนี้ ฉันจะรับตัวแปร $conditions ไปยังข้อความค้นหาที่ใช้งานอยู่ได้อย่างไร

$conditions = 'main_category_id != :main_category_id', ['category_status' => 1, 'main_category_id' => 0, 'sub_category_id' => $id,'type'=> 4];

$result = Category::find()->where($conditions)->orderby('category_name ASC')->all();

ตามคำถามของฉัน main_category_id != 0 โซลูชันอื่นใดที่ใช้งานได้ก็ใช้ได้ดีเช่นกัน

โปรดทราบว่าฉันต้องการตัวแปร $conditions เนื่องจากตัวแปรเหล่านี้แตกต่างกันไป นี่คือคำถามของฉันด้วยคำสั่ง if:

    public function get_subcategory_list($id="",$type="")
{
    $conditions = ['category_status' => 1, 'main_category_id' => 0, 'main_category_id' => $id, 'type' => 2];
    if($type == 2){
        $conditions = ['category_status' => 1, 'main_category_id' => 0, 'sub_category_id' => $id, 'type' => 3];
    }
    if($type == 3){
        $conditions = ['category_status' => 1, 'main_category_id' => 0, 'sub_category_id' => $id,'type'=> 4];
    }
    $result = Category::find()->where($conditions)->orderby('category_name ASC')->all();
    return $result;
}

โปรดทราบว่า $conditions ทำงานได้ดีบนฟังก์ชันด้านบน ปัญหาเดียวอยู่ที่นี่ main_category_id ไม่ควรเท่ากับ 0


person Zack    schedule 08.08.2015    source แหล่งที่มา
comment
ในการกำหนดเงื่อนไขแรก - 'main_category_id' => 0, 'main_category_id' => $id มันพิมพ์ผิดหรือเปล่า? ควรจะเป็น 'main_category_id' => 0, 'sub_category_id' => $id ไม่ใช่เหรอ?   -  person arogachev    schedule 08.08.2015


คำตอบ (1)


คุณไม่สามารถกำหนดตัวแปร ($conditions) ได้เหมือนที่คุณทำ เนื่องจากมันไม่ถูกต้อง

ActiveQuery ของคุณสามารถเขียนได้ดังนี้:

$models = Category::find()
    ->where(['<>', 'main_category_id', 0])
    ->andWhere([
        'category_status' => 1,
        'sub_category_id' => $subCategoryId,
        'type'=> 4,
    ])
    ->orderBy(['category_name' => SORT_DESC])
    ->all();

คุณสามารถแทนที่ <> ด้วย != หรือ not in ในกรณีที่ใช้อาร์เรย์ของรหัสหมวดหมู่หลัก

อ่านเพิ่มเติมเกี่ยวกับการสร้างเงื่อนไข where ใน เอกสารอย่างเป็นทางการ.

อัปเดต: ไม่จำเป็นต้องเปลี่ยนอาร์เรย์ $conditions ทั้งหมดและคัดลอกและวาง คุณสามารถคำนวณ $type ได้ดังนี้:

switch ($type) {
    case 2:
        $typeValue = 3;

        break;
    case 3:
        $typeValue = 4;

        break;
    default:
        $typeValue = 2;
}

ตรรกะนี้ค่อนข้างแปลกนิดหน่อย (อาจจะเพิ่มขึ้น +1 จะดีกว่า)

จากนั้นเพียงแทรก $typeValue แทนค่าคงที่ที่นี่ 'type'=> $typeValue

แม้ว่าคุณจะมีการสร้างแบบสอบถามที่ซับซ้อน คุณก็สามารถแบ่งแบบสอบถามออกเป็น where / orWhere / andWhere แยกกัน และทำการเปลี่ยนแปลงแบบไดนามิกได้

person arogachev    schedule 08.08.2015
comment
เงื่อนไขของฉันแตกต่างกันไป ฉันจึงต้องกำหนดตัวแปร วิธีการทำเช่นนี้คืออะไร? ฉันรู้วิธีใช้ ActiveQuery ตามที่คุณระบุไว้ แต่ฉันต้องการให้ $conditions ของฉันเปลี่ยนตามสถานการณ์ต่างๆ - person Zack; 08.08.2015
comment
โปรดให้รายละเอียดเพิ่มเติมเกี่ยวกับวิธีการเปลี่ยนแปลง - person arogachev; 08.08.2015
comment
ฉันมี โปรดทราบว่าการกำหนดตัวแปร $conditions นั้นถูกต้องโดยสมบูรณ์ - person Zack; 08.08.2015
comment
ไม่ใช่วิธีที่คุณเขียนในตอนแรก (มีเครื่องหมายจุลภาค) - person arogachev; 08.08.2015
comment
จริงอยู่ ตอนแรกฉันเขียนมันโดยมีข้อผิดพลาดเพื่อแสดงสิ่งที่ฉันต้องการเพื่อให้บรรลุ - person Zack; 08.08.2015
comment
ดูเหมือนว่าวิธีแก้ปัญหาที่ให้มาจะทำงานได้ดีเฉพาะเมื่อ ฉันไม่ได้กรองการใช้สิ่งนี้ ตอนนี้ฉันต้องค้นหาสาเหตุที่ทำให้เกิดข้อยกเว้น DB - person Zack; 08.08.2015
comment
หากไม่เห็นสิ่งที่คุณเพิ่มและรายละเอียดข้อยกเว้น ก็ช่วยไม่ได้ - person arogachev; 08.08.2015