Yii2: Bagaimana cara menulis Kueri Aktif di bawah ini?

Dengan menggunakan solusi ini, bagaimana saya bisa memasukkan variabel $conditions ke kueri aktif saya?

$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();

Atas pertanyaan saya main_category_id != 0. Solusi lain apa pun yang berhasil juga baik-baik saja

Harap dicatat bahwa saya memerlukan variabel $conditions karena bervariasi. Inilah pertanyaan saya dengan pernyataan 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;
}

Harap dicatat bahwa $conditions berfungsi dengan baik pada fungsi di atas, satu-satunya masalah adalah di sini main_category_id tidak boleh sama dengan 0.


person Zack    schedule 08.08.2015    source sumber
comment
Dalam kondisi pertama, tugas adalah 'main_category_id' => 0, 'main_category_id' => $id. Apakah ini salah ketik? Bukankah seharusnya 'main_category_id' => 0, 'sub_category_id' => $id?   -  person arogachev    schedule 08.08.2015


Jawaban (1)


Anda tidak dapat menetapkan variabel ($conditions) seperti yang Anda lakukan, itu tidak valid.

ActiveQuery Anda dapat ditulis seperti ini:

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

Anda dapat mengganti <> dengan != atau not in jika menggunakan array id kategori utama.

Baca selengkapnya tentang membuat kondisi where di dokumen resmi.

Pembaruan: Tidak perlu mengubah seluruh array $conditions dan menyalin-menempel. Anda dapat menghitung $type misalnya seperti ini:

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

        break;
    case 3:
        $typeValue = 4;

        break;
    default:
        $typeValue = 2;
}

Logika ini agak aneh (mungkin penambahan +1 akan lebih baik).

Kemudian masukkan saja $typeValue alih-alih nilai statis di sini 'type'=> $typeValue.

Bahkan Anda memiliki beberapa konstruksi kueri yang kompleks, Anda dapat membagi kueri menjadi where / orWhere / andWhere terpisah dan mengubahnya secara dinamis.

person arogachev    schedule 08.08.2015
comment
Kondisi saya berbeda-beda jadi saya perlu menetapkan variabel. Apa cara untuk melakukan ini? Saya tahu cara menggunakan ActiveQuery seperti yang Anda nyatakan tetapi saya memerlukan $conditions saya untuk berubah sesuai dengan situasi yang berbeda. - person Zack; 08.08.2015
comment
Harap berikan detail lebih lanjut tentang bagaimana hal ini dapat berubah. - person arogachev; 08.08.2015
comment
Sudah, harap perhatikan juga bahwa penetapan variabel $conditions sepenuhnya valid. - person Zack; 08.08.2015
comment
Bukan cara Anda menulisnya pada awalnya (dengan koma). - person arogachev; 08.08.2015
comment
Benar, saya awalnya menulisnya dengan kesalahan untuk menunjukkan apa yang perlu saya capai. - person Zack; 08.08.2015
comment
Solusi yang diberikan tampaknya berfungsi dengan baik hanya ketika Saya tidak memfilter menggunakan ini. Saya sekarang perlu mencari tahu apa yang menyebabkan pengecualian DB - person Zack; 08.08.2015
comment
Tanpa melihat apa yang Anda tambahkan dan detail pengecualian, mustahil untuk membantu. - person arogachev; 08.08.2015