[英]Yii2 combine multiple models in a search model
Yii2.0.15 和搜索模型
首先,我不想使用活动记录,我实际上使用new Query()
编写了所有查询。
我正在开发一个商店系统,它的用户具有不同的角色( financial manager, representative, visitor, store, etc ...
),并将所有个性配置文件保存在像用户一样的表中。(我也使用了 RBAC 系统角色)。
我有一个包含 5 列的gridview
: 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) {
// ...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.