Yii2.0.15与搜索模式
首先,我不想使用活动记录,我实际上用new Query()
编写了所有查询。
我正在一个商店系统上工作,它的用户有不同的角色(financial manager, representative, visitor, store, etc ...
),并将所有的个性配置文件保存在一个表中,如user。(我还使用RBAC系统来处理角色)。
我有一个有5列的gridview
:第一个是第三个是第四个,第五个是第六个。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
时,过滤仅应用于最后一个字段。
如果不使用活动记录关系,请告诉我如何解决此问题?
谢谢你的好意。
1条答案
按热度按时间6yt4nkrj1#
下面的结构意味着将只执行匹配方案中的一个。
如果要执行所有匹配方案,请使用
if
运算符: