У меня есть супер администратор, который может создавать пользователей и назначать определенные места для каждого пользователя. Это хранится в простой таблице, где мы получаем идентификатор пользователя и идентификатор местоположения.
Затем у меня есть таблица клиентов. У каждого клиента также есть местоположение с именем loc_id. Как я могу фильтровать так, чтобы в Gridview пользователь мог видеть только клиентов, которые живут в местоположении, на которое у пользователя есть разрешение на просмотр (пользователь — это своего рода администратор, который может манипулировать данными клиента в своей юрисдикции)?
Я получаю идентификатор пользователя
$userId = \Yii::$app->user->identity->id
а затем найти места, которые он может просматривать
$userLocation = Userlocations::find()-where(['user_id' => $userId])->all();
Но теперь, как я могу применить это к стандартному Gridview с моделью поиска и DataProvider, чтобы я все еще мог фильтровать и сортировать GridView по другим свойствам?
$searchModel = new AsociatiiSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
Сначала внутри вашего класса AsociatiiSearch вам нужно добавить открытый атрибут:
class AsociatiiSearch {
public $userLocation;
...
Затем внутри действия вашего контроллера вы найдете userLocation:
$userId = \Yii::$app->user->identity->id
$userLocation = Userlocations::find()-where(['user_id' => $userId])->all();
$searchModel = new AsociatiiSearch();
$searchModel->userLocation = $userLocation;
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
Наконец, в методе поиска AsociatiiSearch вы можете просто добавить еще один фильтр, используя глобальный userLocation:
$query->andFilterWhere(['userLocation' => $this->userLocation]);
Других решений пока нет …