Проблема отношений Yii при попытке отобразить CGridView из 2 моделей - PullRequest
2 голосов
/ 30 сентября 2011

Изображение с описанием таблиц -> 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'),

Затем я пытаюсь отобразить поля is_sent и is_reported из YearlyTask, используя arp.is_sent и arp.is_reported, но ничего не отображается (даже ошибка) Пока данные из RegularTask отображаются нормально.

Что я делаю не так?

Вот фрагмент из провайдера данных ..

<?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 ]

2 голосов
/ 30 сентября 2011

Внешний ключ в одной таблице должен быть первичным ключом в связанной таблице.Если вы посмотрите на оператор SQL, созданный Yii, со своей структурой, вы увидите что-то вроде этого (упрощенно):

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_id и RegularTask. up_id имеют то же значение, что и YearlyTask. id, что неверно.У вас есть несколько решений.Одним из них является создание нового столбца в RegularTask, например yt_id, который будет внешним ключом для YearlyTask. id и, на мой взгляд, это лучшее решение.

В противном случае вы можете удалить столбец первичного ключа id в RegularTask таблице и сделать hp_id и up_id в качестве сложного первичного ключа.В этом случае вы можете использовать способ, который вы пробовали ранее, но, поскольку я не знаю вашу полную структуру БД, я не могу гарантировать, что это хорошее решение.

0 голосов
/ 30 сентября 2011

пробовали ли вы использовать этот стиль:

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

возможно, не самый элегантный способ, но может помочь

...