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
Данное решение работает нормально только тогда, когда я не фильтрую это. Теперь мне нужно выяснить, что вызывает исключение БД - person Zack; 08.08.2015
comment
Не видя того, что вы добавили, и сведений об исключении, невозможно помочь. - person arogachev; 08.08.2015