ahatnya
@ahatnya
Веб-программист

Как в Yii2 на ActiveRecord накинуть условия поиска?

У меня есть индексовая страница заказов. Там есть поиск и сортировка. Контроллер использует searchModel и из него данные пишет в датаПровайдер. мне нужно добавить еще одно условие отбора элементов так, что бы он в GET-е не отображался. Типа
$data = Orders::find()->where(['subdivision_id' => Yii::$app->user->getUserIdentity()->getSubdivisionId()])->all();

и мне нужно данные в $data еще раз фильтрануть параметрами searchModel которые хранятся в GET-массиве

А затем только выводить их вот тут:
<?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],

            'id',
            'sender_address',
            'reciever_address',
            'currency_id',
            ['class' => 'yii\grid\ActionColumn'],
        ],
    ]); ?>


что бы в итоге в $dataProvider хранил в себе $data + $searchModel и в GET-е отображались только данные по сортировке и фильтру searchModel
  • Вопрос задан
  • 893 просмотра
Решения вопроса 1
ahatnya
@ahatnya Автор вопроса
Веб-программист
а б*я понял. в OrdersSearch надо было поковыряться)))))
вот тут:

public function search($params)
    {
        $query = Orders::find();

        // add conditions that should always apply here

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);

        $this->load($params);

        if (!$this->validate()) {
            // uncomment the following line if you do not want to return any records when validation fails
            // $query->where('0=1');
            return $dataProvider;
        }

        $manageer_id = 5;

        // grid filtering conditions
        $query->andFilterWhere([
            'id' => $this->id,
            'currency_id' => $this->currency_id,
            'said_weight' => $this->said_weight,
            'fact_weight' => $this->fact_weight,
            'pay_type' => $this->pay_type,
            'dostavka_price' => $this->dostavka_price,
            'pre_pay' => $this->pre_pay,
            'post_pay' => $this->post_pay,
            'post_pay_days' => $this->post_pay_days,
            'international' => $this->international,
        ]);

        $query->andFilterWhere(['like', 'sender_address', $this->sender_address])
            ->andFilterWhere(['like', 'reciever_address', $this->reciever_address])
            ->andFilterWhere(['like', 'sender_phone', $this->sender_phone]);

        return $dataProvider;
    }
}


на этой строке:
$query = Orders::find();

можно сразу написать условие отбора

$query = Orders::find()->where(['id' => 555, 'active' => 1]);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
mhthnz
@mhthnz
PHP, YII2, Golang, Linux
В serachModel перед выводом функции search вставляете условие в $query
public function search($params)
    {
        ............
        $query->andWhere(['subdivision_id' => \Yii::$app->user->getUserIdentity()->getSubdivisionId()]);
        return $dataProvider;
    }

Но лучше subdivisionId, либо модель user передавать из контроллера в модель и уже в модели его использовать, а не запрашивать из модели данные.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы