Yii:通过一张桌子到另一张桌子的关系

时间:2014-02-04 09:45:16

标签: activerecord yii relation

我有这样的表格方案: enter image description here

我的任务是通过关系从第三个表中获取事件的描述字符串,如下所示:

'dates'=>array(self::HAS_MANY, 'CalendarDates', '', 
                                "on" => '"t"."CalendarDateId"="dates"."calendar_date_id"'),

'events'=>array(self::HAS_MANY, 'CalendarDayEvents', '', 
                                "on" => '"dates"."list_events" = "events"."date_id"')

所以,我认为,从第一关系中获取dates

$UserCalendar =  CalendarsUsers::model()->
                    with(array('dates','events'))->
                    find('user_id =:user_id', array(':user_id'=> $userId));

我会得到这样的计划

Date as Dates

和第三个表格中的事件列表,它链接到每个Date

但是使用上面提到的关系,我得到了“并行”关系,其中日期和事件是“并行”的,所以我不能写这样的代码:

<?php foreach ($calendar->dates as $day): ?>

       <b>Date:</b> <?php echo($day->date_event); ?> <br>
       <i>Event:</i> 
            <?php foreach ($day as $event): ?>
                <?php echo($event->event_description); ?>
            <?php endforeach; ?>
            <br/>        
<?php endforeach; ?>

按预期返回错误。

1 个答案:

答案 0 :(得分:2)

作为建议尝试以下修改。 由于我不知道您准确的表格名称,因此我称其为firstsecondthird

first模型中,添加以下关系:

'second' => array(self::HAS_MANY, 'SECOND_TABLE_MODEL', 'FIRST_TABLE_KEY_WHICH_IS_RELATED_TO_SECOND')

second模型中,添加以下关系:

'third' => array(self::HAS_MANY, 'THIRD_TABLE_MODEL', 'SECOND_TABLE_KEY_WHICH_IS_RELATED_TO_THIRD')

现在,让我们跳过third表关系。我认为您只想访问description表中的third。 然后,如果你喜欢吼叫:

$firstRecords=First::model()->findAll();

您拥有First表中的所有记录。您无需在此处使用with。访问second表数据,该数据与first表相关,您可以执行以下操作:

foreach($firstRecords as $fr){
    //$fr->second->ATTRIBUTE_NAME
}

最后,如果你想从description表格访问third,你可以这样做:

foreach($firstRecords as $fr){
    $second=$first->second;
    foreach($second->third as $st){
       //$st->description
    }
}

我希望它有所帮助