Yii2 объединяет несколько моделей в поисковой модели

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 Некоторое время фильтрация применяется только к последнему полю.

Не используя активные отношения записи, пожалуйста, посоветуйте мне, как решить эту проблему?
Благодарю.

0

Решение

Следующая конструкция означает, что будет выполнен только один из подходящих сценариев.

if ($scenario1) {
// ...
}
elseif ($scenario2) {
// ...
}

elseif ($scenario3) {
// ...
}

Если вы хотите, чтобы все соответствующие сценарии были выполнены, используйте if оператор:

if ($scenario1) {
// ...
}
if ($scenario2) {
// ...
}

if ($scenario3) {
// ...
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]