Yii - CGridView 1对N显示问题

时间:2013-05-02 22:36:17

标签: yii cgridview

我一个月前开始使用Yii,发现它非常直观,但在小部件方面却有些混乱。

在我正在开发的应用程序中,虽然我有时使用Active Record,但我无法使用它的关系,因为我正在使用MyIsam (并且这不能更改)并且它不支持外键。

我的问题是我有一个 CGridView 并希望向其添加自定义数据,但是我遇到了问题。

与正确模型中的 FK 1对多关系,但正如我所说,我无法使用 AR' s 魔术。

我有这个,应用程序模型和配置文件模型。 Profile模型具有应用程序 FK

我有一个函数,所以当我渲染CGrid时,我可以获取每个Application的名称,而不是它的* id_app *。

public function appName($id){
    $app= Yii::app()->db->createCommand()
        ->select('name')
        ->from('tbl_aplications a')
        ->where('a.id=:id_app', array(':id_app'=>$id))
        ->queryRow();

    return $app;
}

在自动生成的模板中,在Profile Admin.php视图中,我得到了:

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'profile-application-grid',
    'dataProvider'=>$model->search(), //maybe the issue is with this criteria? It is currently 'as-is' after the template generation
    'filter'=>$model,
    'columns'=>array(
        'id',
        'name',
                array(
                    'name'=>'id_app',
                    'header'=>'Aplication',

这是我的问题,我已尝试过(以及各种变体):

'value' => 'ProfileApplication::model()->appName($data->id_app)',
'value' => 'ProfileApplication::model()->appName(id_app)',
'value' => 'ProfileApplication::model()->appName("id_app")',

我得到的只是 null 因为它传递的是实际的字符串而不是每行的值。如果我将直接ID传递给函数查询,它会返回正确的值,例如->where('a.id=:id_app', array(':id_app'=>3))

是否需要更改搜索条件? 我发现了类似的问题,但他们都使用AR,例如 Profile-&gt;应用程序或者其他类似的东西,正如我所说,由于 MyIsam <我无法使用它/ em>限制。

此新手感谢任何提示,或链接到有关类似问题的解决方案。

2 个答案:

答案 0 :(得分:2)

使用像您所需的值属性,如PrplHaz4所说,数据提供者。然后,$ data变量具有魔力,它必须在字符串中使用,因为它在幕后是eval()。以下是您要做的事情的示例:

<?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'item-grid',
    'dataProvider'=>$model->search(),
    'columns'=>array(
        array(
            'name' => 'id',
            'header' => 'Item ID',

        ),
        array(
            'name' => 'category_search',
            'header' => 'Category',
            'value' => '$data->category->name',
        ),
    ),
)); ?>

抓取相关项目类别模型的name属性。在项目模型的relations()函数中:

return array(
    'category'=>array(self::BELONGS_TO, 'ItemCategory', 'category_id'),
);

在项目类别模型的relations()函数中:

return array(
    'items'=>array(self::HAS_MANY, 'Item', 'category_id'),
);

答案 1 :(得分:1)

你仍然可以使用与MyISAM的ActiveRecord关系,我相信唯一的区别是,使用MyISAM,如果使用模型生成器(gii或cmd行),它将不会自动创建关系。相反,您必须在Profile模型中自己指定关系。这有效地创建了一个用于AR的“软”fk。

public function relations()
{
    return array(
        'applications'=>array(self::HAS_MANY, 'Applications', 'id_app'),
    );
}

但这并不能完全解决您的问题,因为您需要使用数据提供程序将应用程序模型与概要文件模型一起使用。像这样:

$this->widget('zii.widgets.grid.CGridView', array(
  'id'=>'profile-application-grid',
  'dataProvider'=>Profile::model()->with('Applications'),
  'filter'=>$model,
  'columns'=>array(
    'id',
    'name',
    array(
      'name'=>'applications.name',
      'header'=>'Application',
    ),