2013-05-02 68 views
1

我已经在一个月前开始了Yii,并且发现它非常直观,但是对于小部件却有点混淆。Yii - CGridView 1-to-N显示问题

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

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

它与FK在正确的模型1一对多关系,但正如我所说,我不能使用AR的魔术。

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

我得到一个函数,所以当我渲染CGrid时,我可以获取每个应用程序的名称而不是* 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; 
} 

在自动生成的模板,在配置文件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")', 

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

是否需要改变搜索条件? 我发现了类似的问题,但他们都使用AR,如配置文件 - >应用程序或沿着这些线和我说,我不能使用它,因为MyIsam限制。

任何提示都会被这个新手所赞赏,或者链接到一个关于类似问题的解决方案。

+0

用MyISAM的唯一的一点是,它不会自动 - 在生成模型时检测您的关系。然而,你可以把这些关系放在你自己身上,而你将拥有你想要的所有魔法。有关如何使用value属性来访问相关模型的属性,请参阅我的答案。 – JPR 2013-05-03 04:38:05

回答

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', 
     ), 
    ), 
)); ?> 

抓取相关项目类别模型的名称属性。在关系()的项目模型的功能:

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

而在关系()项目类别模型的功能:

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

你应该仍然可以使用ActiveRecord与MyISAM的关系,但我唯一的区别在于,如果使用模型生成器(gii或cmd行),使用MyISAM时,它不会自动创建关系。相反,您将不得不在配置文件模型中自己指定关系。这有效地创建了一个适用于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', 
    ), 
+0

嗯......我得到'ProfileApplication及其行为没有名为“getData”'的方法或闭包。 – Silver 2013-05-03 09:14:57

+0

没关系,感谢您的'软键'想法:) – Silver 2013-05-03 09:17:54