Yii2.0.15 и поиск моделей
Прежде всего, я не хочу использовать активную запись, я фактически написал все свои запросы с new Query()
,
Я работаю над системой магазина, в которой его пользователи играют разные роли (financial manager, representative, visitor, store, etc ...
) и сохранил все профили личности в виде таблицы пользователя (я также использовал систему RBAC для ролей).
у меня есть gridview
с 5 столбцами: User job
,Store name
,Brand
,Rep no
а также City-province
,
User job
: роль пользователя
Store name
: имя магазина пользователя с ролью магазина
Brand
: фирменные продукты
Rep no
: представление пользователя с представительской ролью
City-province
: название города и провинции Представитель или магазин
Как видите, здесь приведена комбинация таблиц в gridview
,
Моя проблема состоит в том, чтобы объединить запросы в поиске, используя new Query()
,
Части моего кода следующие:
UserSearch model
:
public function search($params)
{
$query = Users::find();
if(isset($params['UserSearch']['user_job']) && !empty($params['UserSearch']['user_job'])) {
$role = $params['UserSearch']['user_job'];
$query->join('LEFT JOIN','auth_assignment','auth_assignment.user_id = temp_users.user_id')
->andFilterWhere(['auth_assignment.item_name' => $role, 'user_default_business' => [2, 4, 5]]);
} elseif(isset($params['UserSearch']['brand']) && !empty($params['UserSearch']['brand'])) {
$brand = $params['UserSearch']['brand'];
$query->join('LEFT JOIN', 'temp_representative',
'temp_representative.id = temp_users.user_id')
->join('LEFT JOIN', 'temp_store', 'temp_store.id = temp_users.user_id')
->andFilterWhere(['or',
['like', 'temp_representative.business_id', $brand],
['like', 'temp_store.business_id', $brand]
]);
}
elseif (isset($params['UserSearch']['rep_no']) && !empty($params['UserSearch']['rep_no'])){
$code = $params['UserSearch']['rep_no'];
$query->join('LEFT JOIN', 'temp_representative',
'temp_representative.user_id = temp_users.user_id')
->andFilterWhere(['like', 'rep_no', $code]);
}
elseif (isset($params['UserSearch']['city_province']) && !empty($params['UserSearch']['city_province'])){
$name = $params['UserSearch']['city_province'];
$query->join('LEFT JOIN', 'temp_store',
'temp_store.user_id = temp_users.user_id')
->join('LEFT JOIN', 'temp_representative', 'temp_representative.user_id = temp_users.user_id')
->andFilterWhere(['or',
['like','store_city',$name],
['like','store_province',$name],
])
->orFilterWhere(['or',
['like','rep_city',$name],
['like','rep_province',$name]
]);
}
elseif (isset($params['UserSearch']['store_name']) && !empty($params['UserSearch']['store_name'])){
$storeName = $params['UserSearch']['store_name'];
$query->join('LEFT JOIN', 'temp_store',
'temp_store.user_id = temp_users.user_id')
->andFilterWhere(['like', 'store_name', $storeName]);
} else {
$query = Users::find()->where(['user_default_business' => [2, 4, 5]]);
}
$dataProvider = new ActiveDataProvider([
'query' => $query
]);
if(!(($this->load($params)) && $this->validate())){
return $dataProvider;
}
$query->andFilterWhere(['like', 'user_name_family', $this->user_name_family])
->andFilterWhere(['like', 'user_phone', $this->user_phone]);
return $dataProvider;
}
Каждое поле работает корректно само по себе, но не работает должным образом при объединении, например: когда мы вводим два поля brand
а также city-province
Некоторое время фильтрация применяется только к последнему полю.
Не используя активные отношения записи, пожалуйста, посоветуйте мне, как решить эту проблему?
Благодарю.
Следующая конструкция означает, что будет выполнен только один из подходящих сценариев.
if ($scenario1) {
// ...
}
elseif ($scenario2) {
// ...
}
elseif ($scenario3) {
// ...
}
Если вы хотите, чтобы все соответствующие сценарии были выполнены, используйте if
оператор:
if ($scenario1) {
// ...
}
if ($scenario2) {
// ...
}
if ($scenario3) {
// ...
}
Других решений пока нет …