尝试从 2 个模型显示 CGridView 时出现 Yii 关系问题


Yii relations trouble when trying to display CGridView from 2 models

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

每个表都是一个模型。

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

现在我需要它在同一行中显示"年度任务"中的字段。

">hp_id"和">up_id"是两个表中的 FK(外键(。

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

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

然后,我尝试使用"arp.is_sent"和"arp.is_reported"显示YearlyTask中的"is_sent"和"is_reported"字段,但没有任何显示(甚至没有错误(。而来自常规任务的数据正常显示。

我做错了什么?

这是来自数据提供程序的代码片段。

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

一个表中的外键必须是链接表中的主键。如果你用你的结构查看 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`)

如您所见,它寻找的是 两者都RegularTask .hp_idRegularTask.up_idYearlyTask具有相同的值。id这是不正确的。您有几种解决方案。其中之一是在 RegularTask 中创建新列,例如 yt_id 这将是YearlyTask的外键。id在我看来,这是最好的解决方案。

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

您是否尝试过使用此样式:

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

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