@salopot

Трудности с ActiveRecord -> relations?

Переделываю проект БЕЗ ВОЗМОЖНОСТИ изменить структуру таблиц. Изучаю YII (версия 1.1.13)

Настраиваю связи в моделях и запутался в довольно-таки простых отношениях.

Есть связка Country < — Area < — Settlement (Тобиж в каждой дочерней модели есть ссылка на родителя)



1. Для модели Country отношения выглядят так:

return array(<br>
            'areas' => array(self::HAS_MANY, 'Area', 'id_country'),<br>
            'areaCount'=>array(self::STAT, 'Area', 'id_country'),<br><br>
            //Статический запрос через две таблицы не прокатил (вернее если бы в area, была свяь к settlement а не на оборот)<br>
            //'settlementCount'=>array(self::STAT, 'Settlement', 'area(id_country, id_area)'),<br><br>
            //id - относится к area<br>
            'settlements'=>array(self::HAS_MANY, 'Settlement', array('id'=>'id_area'), 'through'=>'areas'),<br>
    );<br>




Вопросы:

1.1. Верно ли настроена связь settlements (она работает, но есть подозрение что можно настроить без промежуточной связи)?

1.2 Как все-таки настроить settlementCount?



2. Есть модель Message где указана ссылка только на id_settlement.

return array(<br>
            //'country' => ???,<br>
            //'area' => ???,<br>
            'settlement' => array(self::BELONGS_TO, 'Settlement', 'id_settlement'), /<br>
);<br>


2.1 Как настроить связь на Area?

2.2 Как настроить связь на Country?
  • Вопрос задан
  • 5070 просмотров
Пригласить эксперта
Ответы на вопрос 2
@salopot Автор вопроса
Частично отвечу сам себе на вопрос 2.1:
Совсем недавно вышел Yii 1.1.14 RC в котором заявлена поддержка BELONGS_TO для опции through и действительно тесты показали что для Area можно установить отношение так:
public function relations()
	{
            'settlement' => array(self::BELONGS_TO, 'Settlement', 'id_settlement'), 
            'area' => array(self::BELONGS_TO, 'Area', array('id_area'=>'id'), 'through'=>'settlement'),
            //'country' => array(self::BELONGS_TO, 'Country', array('id_country'=>'id'), 'through'=>'area'),
        }
}

Relation для Area нормально отрабатывает с Message::model()->with(array('settlement', 'area'))->…

Установка relation для country через area не сработала, тобиж цепочки вызовов не поддерживаются…
Да и не всегда нужна тот самый промежуточный relation хотя погоды он конечно не сыграет.

Вообще если задуматься, то необходимые мне отношения больше похожи на MANY_MANY, только вот ссылается не сама промежуточная таблица, а на нее.
Возможно многоуважаемый SamDark немного прояснит ситуюацию.
Ответ написан
Комментировать
@salopot Автор вопроса
Организовал settlementCount так:

class Country extends CActiveRecord
{

	public function relations()
	{
		// NOTE: you may need to adjust the relation name and the related
		// class name for the relations automatically generated below.
		return array(
            'areas' => array(self::HAS_MANY, 'Area', 'id_country'),

            'settlementCount'=>array(self::STAT, 'Area', 'id_country',
                'join' => 'INNER JOIN `Settlement` ON `Settlement`.id_area = `t`.id',
            ),

            'settlements'=>array(self::HAS_MANY, 'Settlement', array('id'=>'id_area'), 'through'=>'areas'),
...

Хотя какой-то осадок неверности решения остался…
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы