Yii « Cвязь между таблицами MANY MANY

Подскажите как правильно прописать relations для моделей Main и Ancest?
Нужно ли создавать отдельную модель main_ancest?

main
id|name

ancest
id|name

main_ancest
main_id|ancest_id

?

1 ответов


Это?


class MainAncest extends CActiveRecord
{
    ...
    public function tableName()
    {
        return '{{main_ancest}}';
    }
    ...
}


class Main extends CActiveRecord
{
    ...
    public function tableName()
    {
        return '{{main}}';
    }

    public function relations()
    {
        return array(
            'ancest' => array(self::MANY_MANY, 'Users', MainAncest ::tableName().'(main_id, ancest_id)'),
            'ancestCount' => array(self::STAT, 'Users', MainAncest ::tableName().'(main_id, ancest_id)'),
        );
    }
    ...
}


class Ancest extends CActiveRecord
{
    ...
    public function tableName()
    {
        return '{{ancest}}';
    }

    public function relations()
    {
        return array(
            'main' => array(self::MANY_MANY, 'Users', MainAncest ::tableName().'(ancest_id, main_id)'),
            'mainCount' => array(self::STAT, 'Users', MainAncest ::tableName().'(ancest_id, main_id)'),
        );
    }
    ...
}
 

Так более легче код все же и более понятнее
И зачем прописывать через [модель]::tableName() если можно вписать напрямую через [имя таблицы], конечно у вас подстраховочный вариант, но если кодить в своем стиле, думаю все ясно и соответствует при генерации кода >

то есть таблица [название_название] будет генерить модель [НазваниеНазвание]
соответственно здесь и обратная логика для модели >
[НазваниеНазвание] - таблица [название_название]

Модель Main


public function relations()
{
    return array(
        'ancests'=>array(
            self::MANY_MANY,
            'Ancest',
            'main_ancest(ancest_id, main_id)',
        ),
        'main_ancest'=>array(
            self::HAS_MANY,
            'MainAncest',
            'main_id',
        ),
    );
}
 

Модель Ancest

public function relations()
{
    return array(
        'mains'=>array(
            self::MANY_MANY,
            'Main',
            'main_ancest(main_id, ancest_id)',
        ),
        'main_ancest'=>array(
            self::HAS_MANY,
            'MainAncest',
            'ancest_id',
        ),
    );
}
 

Модель MainAncest

public function relations()
{
    return array(
        'main'=>array(
            self::BELONGS_TO,
            'Main',
            'main_id',
        ),
        'ancest'=>array(
            self::BELONGS_TO,
            'Ancest',
            'ancest_id',
        ),
    );
}
 

Актуально если в модели таблицы много
self::BELONGS_TO и только PK (PrimaryKeys)

этот код при имеющихся 2ух PK выполнится верно

print_r(Main::model()->findByPk(5)->ancests);
print_r(Ancest::model()->findByPk(8)->mains);