当试图从2个模型中显示CGridView时,Yii关系出现问题

时间:2011-09-29 23:39:55

标签: php yii model yii-relations

描述表格的图片 - > http://i.stack.imgur.com/ki2YP.jpg

每个表格都是模型。

通过CGridView显示的主要模型是“RegularTask”。

现在我需要它来显示同一行中“YearlyTask”的字段。

hp_id ”和“ up_id ”是两个表格中的FK(外键)。

我尝试在RegularTask模型中设置relations(),如下所示:

'arp' => array(self::BELONGS_TO, 'YearlyTask', 'hp_id, up_id'),

然后我尝试使用“arp.is_sent”和“arp.is_reported”显示YearlyTask中的“is_sent”和“is_reported”字段,但没有显示任何内容(甚至没有错误)。来自RegularTask的数据正常显示。

我做错了什么?

以下是dataprovider的摘录..

<?php
$dataProvider=new CActiveDataProvider('RegularTask', array(
    'criteria'=>array(
        'condition'=>'t.id_id=' . $model->id,
        'order'=>'t.created DESC',
        'with'=>array('arp'),
    ),
    'pagination'=>array(
        'pageSize'=>10,
    ),
));

$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider,
    'columns'=>array(
        'comment',
        'arp.is_sent'
    ),
));
?>

2 个答案:

答案 0 :(得分:2)

一个表中的外键必须是链表中的主键。 如果您查看Yii使用您的结构创建的SQL语句,您将看到类似这样的内容(简化):

SELECT `t`.*, `arp`.* FROM `RegularTask` `t` LEFT OUTER JOIN `YearlyTask` `arp` ON (`t`.`hp_id`=`arp`.`id`) AND (`t`.`up_id`=`arp`.`id`)

正如您所看到的,它所寻找的是RegularTaskhp_idRegularTaskup_id具有与YearlyTask相同的值。{{ 1}}这是不正确的。 你有几个解决方案。其中一个是在RegularTask中创建新列,例如id,它将是yt_idYearlyTask的外键,在我看来这是最好的解决方案。

否则,您可以删除id表中的主键列id,并将RegularTaskhp_id作为复杂的主键。在这种情况下,您可以使用您之前尝试过的方式,但由于我不知道您的完整数据库结构,我不能保证这是一个很好的解决方案。

答案 1 :(得分:-1)

您是否尝试过使用此风格:

$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider,
    'columns'=>array(
        'comment',
        array(
            'header'=>'Sent',
            'type'=>'raw',
            'value'=>'$data->arp->is_sent',
        )
    ),
));

也许不是最优雅的方式,但可能会有所帮助