【问题标题】:Yii relations trouble when trying to display CGridView from 2 models尝试从 2 个模型显示 CGridView 时出现 Yii 关系问题
【发布时间】:2011-09-29 23:39:55
【问题描述】:

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

每个表都是一个模型。

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

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

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”字段,但没有显示(甚至没有错误)。而来自 RegularTask 的数据正常显示。

我做错了什么?

这是来自数据提供者的 sn-p..

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

【问题讨论】:

  • 你能显示你的数据提供者和你试图从哪里访问相关值的 sn-p 吗?
  • @ldg 我更新了描述并添加了您要求的代码 sn-p。
  • 您的视图代码看起来不错,所以我怀疑这与关系有关 - 这种关系在小部件之外是否有效?如果没有,请尝试更改关系类型。请注意,如果您使用真正的外键 (InnoDB),您可以尝试让 gii 为您创建关系。

标签: php yii model yii-relations


【解决方案1】:

一个表的外键必须是链表的主键。 如果你用你的结构查看 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 的外键,我认为这是最好的解决方案。

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

【讨论】:

    【解决方案2】:

    您是否尝试过使用这种风格:

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

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

    【讨论】:

    • fyi,确实样式可能更容易调试,但这不是问题。
    • 对于值,我建议使用 CHtml::value($data,'arp.is_sent') 它将避免空关系错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多