Yii $ criteria->比较将两个表与另一个表的值进行比较

时间:2014-04-29 08:45:31

标签: php sql-server yii

[解决] 我需要将两个ID表与一个Detail表进行比较,以便过滤我的CGridview。

“详细信息”表有三个重要字段:

1 - id of the detail row
2 - ID of an assigned PERSON
3 - ID of an assigned GROUP (of PERSONs)

只能指定一个人或一个人。两者都不能分配。但同时他们中的任何人都必须(PERSON,GROUP或NONE)

然后我有两个PERSON和GROUP的ID表。 basic,只有一个id链接到detail,一个NAME定义为NAME。

在我的CGridView中我想在一个字段中添加GROUP和PERSON作为SUPPORT,因为我知道它们不会因为之前解释的EITHER规则而发生冲突。所以我得到的那些价值观,如:

在列数组中:

array(
    'header'=>'supp group/person',
    'value'=>'(!$data->assignedSupportperson && !$data->assignedSupportgroup ? 
        "null" : 
        ($data->assignedSupportperson ? 
            $data->assignedSupportperson->name : 
            $data->assignedSupportgroup->name
        )
    )',
),

很容易,但困难的部分是我需要为此列添加过滤器

所以我的逻辑告诉我在我的模型中使用$criteria->compare()来将两个ID表与DETAIL表中的两列进行比较。我使用$criteria->compare()来引用ID表来进行文本字段过滤,所以我对此有了一些了解。

但是,如果有人能够很好地操纵模型,请分享你的知识,因为我迷失了。

[添加源代码] 网格视图::

$model = new TicketDetail('search');
    if (isset($_GET['TicketDetail'])) {
        $model->attributes = $_GET['TicketDetail'];
    }
    $this->widget('bootstrap.widgets.TbGridView', array(
        'id' => 'Assigned-Ticket-grid',
        'dataProvider'=>$model->assignedToUser(Yii::app()->user->data()->id)->search(),
        'template' => "{items}{pager}",
        'htmlOptions'=>array(),
        'itemsCssClass' => 'table table-striped table-bordered table-condensed',
        'filter' => $model,
        'columns' => array(
            array(
                'name' => 'id',
                'header' => 'ID',
                'headerHtmlOptions'=>array(
                    'width'=> 50,
                ),
            ),
            array(
                    'header'=>'supp group/person',
                    'value'=>'$data->AssignedSupport?$data->AssignedSupport:"null"',
                    //'filter'=>$model,    <----- heres where i tried a couple things.
                    'headerHtmlOptions'=>array(
                        'width'=>100
                    )
                ),
            ),
      );

model ::

public function getAssignedSupport()
    { 
    return !$this->assignedSupportperson&&!$this->assignedSupportgroup?"null":$this->assignedSupportperson?$this->assignedSupportperson->name:$this->assignedSupportgroup->name); 
    }

是否必须能够搜索过滤器的值?还是我的错误印象?

1 个答案:

答案 0 :(得分:0)

我建议您为Detail模型添加计算字段:

public function getAssignedSupport()
{ 
  return !$this->assignedSupportperson && !$this->assignedSupportgroup?"null":($this->assignedSupportperson?$this->assignedSupportperson->name:$this->assignedSupportgroup->name;
}

现在,使用Yii的__get函数,您可以将上述方法的结果作为属性(例如$data->assignedSupport)访问,就像它是数据库中的属性一样。将计算列添加到模型中比将更简单,更清晰的方式添加到视图中。

修改 要在gridview中为计算列创建自定义过滤器和排序,还必须编辑模型中的search()方法。有关实际示例,请查看以下文章: Sort and filter a custom or composite CGridView column