Php 如何在yii2中过滤gridview表?

Php 如何在yii2中过滤gridview表?,php,mysql,yii2,Php,Mysql,Yii2,我目前有两个gridview表,一个显示所有数据,另一个只显示id=2的数据。是否可以只筛选一个表而不影响另一个表?我知道我可以从搜索模型中筛选,但这将影响所有表,我希望它只影响一个表 能给我两个数据提供者吗 这是我的搜索模型中的代码: class JobPlanningSearch extends JobPlanning { /** * @inheritdoc */ public function rules() { return [

我目前有两个gridview表,一个显示所有数据,另一个只显示id=2的数据。是否可以只筛选一个表而不影响另一个表?我知道我可以从搜索模型中筛选,但这将影响所有表,我希望它只影响一个表

能给我两个数据提供者吗

这是我的搜索模型中的代码:

class JobPlanningSearch extends JobPlanning
{
    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['id', 'priority', 'employer_id', 'client_id', 'status', 'activity'], 'integer'],
            [['job_description', 'impediment', 'date', 'estimated_time', 'due_date'], 'safe'],
        ];
    }

    /**
     * @inheritdoc
     */
    public function scenarios()
    {
        // bypass scenarios() implementation in the parent class
        return Model::scenarios();
    }

    /**
     * Creates data provider instance with search query applied
     *
     * @param array $params
     *
     * @return ActiveDataProvider
     */
    public function search($params)
    {
        $query = JobPlanning::find();

        // add conditions that should always apply here

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);

        $this->load($params);

        if (!$this->validate()) {
            // uncomment the following line if you do not want to return any records when validation fails
            // $query->where('0=1');
            return $dataProvider;
        }

        // grid filtering conditions
        $query->andFilterWhere([
            'id' => $this->id,
            'priority' => $this->priority,
            'client_id' => $this->client_id,
            'employer_id' => $this->employer_id,
            'estimated_time' => $this->estimated_time,
            'status' => $this->status,
            'activity' => $this->activity,
            //'actual' => $this->actual,
            //'actual' => 1,
        ]);

        $query->andFilterWhere(['like', 'job_description', $this->job_description]);
        $query->andFilterWhere(['like', 'activity', $this->activity]);

        return $dataProvider;
    }

您必须在控制器中操作数据提供程序

$searchModel = new JobPlanningSearch();        
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
$dataProvider->query->andWhere(['=','id',2]);
  • 将其从JobPlanningSearch中的搜索功能中删除

    $query->andFilterWhere([

    ]))

  • 在这种情况下,ID将始终为2

    但是,如果您希望有一个默认值(第一次)并允许用户更改它,您应该跳过步骤2。并在控制器中添加一个条件:

    ...
    if(count(Yii::$app->request->queryParams) == 0){
        $dataProvider->query->andWhere(['=','id',2]);
    }
    

    这只是一个示例,您应该检查queryparams中是否未发送ID字段。

    您需要使用两个搜索模型,每个GridView一个,当然还有两个数据提供程序

    此外,您还需要更改其中一个SearchModel的
    formName
    属性,以避免过滤影响两个网格


    在控制器中,当将参数传递给修改后的searchModel的
    search()
    方法时,以您在此searchModel中分配给formName的新名称传递参数。

    您需要两个数据提供程序,如下所示:

    $searchModelOne = new JobPlanningSearch();        
    $dataProviderOne = $searchModelOne->search(Yii::$app->request->queryParams);
    $dataProviderOne->pagination->pageParam = 'dp-one-page'; //set page param for first dataprovider
    $searchModelTwo = new JobPlanningSearch();   
    searchModelTwo->id = 2;     // set id = 2 in second dataprovider
    $dataProviderTwo = $searchModelTwo->search(Yii::$app->request->queryParams);
    $dataProviderTwo->pagination->pageParam = 'dp-two-page'; //set page param for second dataprovider
    

    是的,您可以有两个数据提供程序,这就是方法。@Bizley好的,谢谢,我会尝试找到如何做到这一点,但这会影响所有人。我希望它只影响一个表。显然,您需要创建两个数据提供者。每张桌子一张。
    $searchModelOne = new JobPlanningSearch();        
    $dataProviderOne = $searchModelOne->search(Yii::$app->request->queryParams);
    $dataProviderOne->pagination->pageParam = 'dp-one-page'; //set page param for first dataprovider
    $searchModelTwo = new JobPlanningSearch();   
    searchModelTwo->id = 2;     // set id = 2 in second dataprovider
    $dataProviderTwo = $searchModelTwo->search(Yii::$app->request->queryParams);
    $dataProviderTwo->pagination->pageParam = 'dp-two-page'; //set page param for second dataprovider