使用具有相关模型的表单过滤 yii2 网格 [英] Filtering yii2 grid using a form with related model

查看:26
本文介绍了使用具有相关模型的表单过滤 yii2 网格的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用带有搜索表单的搜索模型,我想根据表单中输入的值过滤网格视图.表单域属于关联表

Am using a search model with a search form and i would like to filter a grid view based on the value entered in the form. The form field is of a related table

实际上,我正在搜索 tblpritems 并通过在 tblprsuppliers 中输入供应商 ID 来过滤 pr_solicitation_id 列上的网格

Am actually searching tblpritems and filtering its grid on the column pr_solicitation_id by entering supplier_id as in the tblprsuppliers

这是模型关系在 tblpritems

This is the model relationships In the tblpritems

public function getPrSolicitation()
{
return $this->hasOne(Tblprsolicitations::className(), ['pr_solicitation_id'   
 => 'pr_solicitation_id']); 
}

在 Tblprsolicitations 模型中与 tblprsuppliers 相关

In the Tblprsolicitations model is related to tblprsuppliers by

public function getPRsuppliers()
 {
  return $this->hasOne(Tblprsuppliers::className(), ['pr_solicitaion_id'
  => 'pr_solicitaion_id']);
}

我试过了

这是我的搜索表单(用于 tblpritems).这引用了 tblpritems 表中的 pr_solicitation_id 字段

This is my search form (for the tblpritems). This references the pr_solicitation_id field in the tblpritems table

 <?= $form->field($model, 'prSolicitation[pRsuppliers][supplier_id]')->textInput(['placeholder' => 'Enter supplier'])->label(false); ?>

但这不会过滤网格

这也是网格搜索

    public function search($params)
{
    $query = Tblpritems::find();

    // add conditions that should always apply here

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

    $this->load($params);


    // grid filtering conditions
    $query->andFilterWhere([
        'PRlineID' => $this->PRlineID,
        'Quantity' => $this->Quantity,
        'Unit_Price' => $this->Unit_Price,
        'Extended_price' => $this->Extended_price,
        'Currency_ID' => $this->Currency_ID,
        'PRID' => $this->PRID,
        'pr_solicitation_id' => $this->pr_solicitation_id,  //This is what am using t filter the grid
        'date_item_received' => $this->date_item_received,
        'Quantity_received' => $this->Quantity_received,
        'Received_by' => $this->Received_by,
        'item_received_status' => $this->item_received_status,
    ]);

    $query->andFilterWhere(['like', 'Tracking_Code', $this->Tracking_Code])
        ->andFilterWhere(['like', 'Description', $this->Description])
        ->andFilterWhere(['like', 'Remarks_on_receipt', $this->Remarks_on_receipt]);

    return $dataProvider;
}

为什么它不起作用?

我也试过

<?= $form->field($model, 'prSolicitation->pRsuppliers[supplier_id]')->textInput(['placeholder' => 'Enter supplier'])->label(false); ?>   

但这会返回一个错误,只应传递字符

but this returns an error of only characters should be passed

推荐答案

您需要在搜索模型中创建一个虚拟属性,在搜索规则中将其标记为安全,然后使用关系进行搜索,在 where 语句中添加过滤器和在表单或网格中添加输入.

You need to create a virtual attribute in your search model, mark it as safe in your search rules, then search with relations, add the filters in where statement and add the input in the form or grid.

在您的搜索模型中添加一个虚拟属性:

In your search model add a virtual attribute:

public $supplier_id;

在您的规则中添加:

[['supplier_id'], 'safe'],

[['supplier_id'], 'integer'],

在搜索方法中搜索这样的关系:

In search method search with relations like this:

$query = Tblpritems::find();
$query->joinWith(['prSolicitation prSolicitation', 'prSolicitation.pRsuppliers pRsuppliers']);

并在您的过滤器中添加:

And in your filters add:

$query->andFilterWhere([
    'PRlineID' => $this->PRlineID,
    'Quantity' => $this->Quantity,
    'Unit_Price' => $this->Unit_Price,
    'Extended_price' => $this->Extended_price,
    'Currency_ID' => $this->Currency_ID,
    'PRID' => $this->PRID,
    'pr_solicitation_id' => $this->pr_solicitation_id,  //This is what am using t filter the grid
    'date_item_received' => $this->date_item_received,
    'Quantity_received' => $this->Quantity_received,
    'Received_by' => $this->Received_by,
    'item_received_status' => $this->item_received_status,

    'prSolicitation.pRsuppliers.pr_supplier_id' => $this->supplier_id,

]);

形式:

<?= $form->field($model, 'supplier_id')->textInput(['placeholder' => 'Enter supplier'])->label(false); ?>

还要检查这两个链接:

Yii 2.0:在 GridView 上显示、排序和过滤模型关系

过滤器GridView Yii 2.0 中按计算/相关字段排序

这篇关于使用具有相关模型的表单过滤 yii2 网格的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆