Yii: связь через одну таблицу с другой

У меня такая схема таблиц: введите здесь описание изображения

Моя задача получить строку описания события из третьей таблицы через отношения, которые выглядят так:

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

который возвращает мне ошибку, как и ожидалось.


person Eugene Shmorgun    schedule 04.02.2014    source источник
comment
$day — это объект, который расширяет CActiveRecord, верно? Почему вы используете его как массив внутри foreach?   -  person Jan K. S.    schedule 04.02.2014


Ответы (1)


В качестве предложения попробуйте следующую модификацию. Поскольку я не знаю точного названия ваших таблиц, я называю их first, second и third соответственно.

В вашей модели 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
    }
}

Я надеюсь, что это поможет

person Ali MasudianPour    schedule 04.02.2014
comment
Хм, когда я пытаюсь использовать этот код $fr-›second-›ATTRIBUTE_NAME (у меня foreach ($firstRecords as $record) { var_dump($record-›dates-›date_event); }; ), он возвращает мне NULL. - person Eugene Shmorgun; 04.02.2014
comment
даты - вторая модель - person Eugene Shmorgun; 04.02.2014
comment
Вы указали правильное отношение в методе отношения вашей первой модели? - person Ali MasudianPour; 04.02.2014
comment
Да, вы правы, это была моя ошибка. возвращает OK, пробуем дальше. - person Eugene Shmorgun; 04.02.2014
comment
В качестве предложения вы можете использовать CVarDumper::dump($variable,6789,true) вместо var_dump, что действительно мощно. - person Ali MasudianPour; 04.02.2014
comment
Теперь, когда я пытаюсь получить доступ к «третьему», выполняется следующий SQL: SELECT events.id AS t1_c0, events.date_id AS t1_c1, events.event_description AS t1_c2 FROM CalendarDayEvents events WHERE (events.date_id=4), но date_id form WHERE предложение имеет неверное значение, должно быть значением из списка_событий "второй" таблицы - person Eugene Shmorgun; 04.02.2014
comment
да, схема правильная и работает, вместо последнего предложения WHERE - person Eugene Shmorgun; 04.02.2014
comment
Пожалуйста, проверьте данные вашей таблицы, чтобы быть уверенными в данных. Я думаю, что невозможно увидеть неправильное значение - person Ali MasudianPour; 04.02.2014