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 :(得分:1)
以下构造意味着只会执行一个匹配方案。
if ($scenario1) {
// ...
}
elseif ($scenario2) {
// ...
}
elseif ($scenario3) {
// ...
}
如果您希望执行所有匹配的方案,请使用if
运算符:
if ($scenario1) {
// ...
}
if ($scenario2) {
// ...
}
if ($scenario3) {
// ...
}