繁体   English   中英

Yii2 在一个搜索模型中组​​合多个模型

[英]Yii2 combine multiple models in a search model

Yii2.0.15 和搜索模型

首先,我不想使用活动记录,我实际上使用new Query()编写了所有查询。
我正在开发一个商店系统,它的用户具有不同的角色( financial manager, representative, visitor, store, etc ... ),并将所有个性配置文件保存在像用户一样的表中。(我也使用了 RBAC 系统角色)。
我有一个包含 5 列的gridviewUser jobStore nameBrandRep noCity-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;    
}    

每个字段单独工作正常,但组合时无法正常工作,例如:当我们输入两个字段brandcity-province一段时间时,过滤仅适用于最后一个字段。

不使用活动记录关系,请告诉我如何解决这个问题?
谢谢。

下面的构造意味着只会执行匹配的场景之一。

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

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

如果要执行所有匹配的场景,请使用if运算符:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM