3

我对 yii 很陌生,遇到了以下问题。我有 2 个相关表,ClientTicketProduct,其结构如下:

客户票

  • ID
  • 票名
  • client_id
  • product_id

产品

  • ID
  • 类型
  • 模型

这两个表通过将 ClientTicket.product_id 绑定到 Product.id 的外键相关联。

问题

在 ClientTicket 的管理视图中,我设法包含了两个 Product 列(品牌、型号),并为每个列显示了搜索框,但过滤没有按预期工作。例如:当我在两个搜索框(品牌、型号)中的任何一个中搜索时,另一个会自动填充我输入的相同值(因此没有搜索结果)。

ClientTicket 模型:

    public function relations()
{
    // NOTE: you may need to adjust the relation name and the related
    // class name for the relations automatically generated below.
    return array(
        'product' => array(self::BELONGS_TO, 'Product', 'product_id'),
        ........
    );
}

    public function search()
{
    // Warning: Please modify the following code to remove attributes that
    // should not be searched.

    $criteria=new CDbCriteria;

    ...
    $criteria->compare('product.model',$this->product_id, true);
    $criteria->compare('product.brand',$this->product_id, true);
    ...

    $criteria->with=array(..., 'product',);
    $criteria->together= true;

    return new CActiveDataProvider($this, array(
        'criteria'=>$criteria,
        'pagination' => array('pageSize' => 10),
    ));
}

ClientTicket Admin 视图文件:

<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'client-ticket-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
    'ticket_number',
    'ticket_date',
    array('name'=>'agent_id',
        'header'=> 'Agent',
        'value'=> '$data->ticket_agent->name',
        'filter'=>CHtml::listData(Agent::model()->findAll(), 'name', 'name'),
        ),
    ...
    array('name'=>'product_id',
        'header'=> 'Product',
        'value'=> '$data->product->model',
        ),
    array('name'=>'product_id',
        'header'=> 'Brand',
        'value'=>'$data->product->brand'
        ),
4

2 回答 2

0

供其他用户参考,这是我如何让它工作的。再次感谢您的及时回复。:)

ClientTicket 模型内部:

  • 声明了一个名为 $brand 的新公共变量
  • 在rules()函数内部将'brand'添加到'safe' 'on'=>'search'数组
  • 在search()函数中添加了一个新条件,如下所示:
    $criteria->compare('product.brand',$this->brand, true);

在 ClientTicket 管理视图文件中:

从此修改产品品牌栏:

array('name'=>'product_id',
    'header'=> 'Brand',
    'value'=>'$data->product->brand'
    ),

对此:

 array('name'=>'product.brand',
    'header'=> 'Brand',
    'filter'=>CHtml::activeTextField($model,'brand'),
    ),
于 2013-10-23T20:29:24.390 回答
0

您的productbrand列都具有相同name但不同的values. 过滤器获取字段名称,name除非您明确声明,即创建您自己的活动字段。此外,您使用相同的属性product_id来搜索函数中的两个字段search

Yii已经回答了如何使用相关模型进行过滤- 如何在管理页面上通过外键/相关键中的列进行搜索?

于 2013-10-23T07:06:37.947 回答