Несколько отношений в CakePHP - PullRequest
0 голосов
/ 05 января 2011

Предположим (из-за отсутствия лучшего примера) у меня есть модель Person и другая модель Twin (имеется в виду пара близнецов).У Twins есть два внешних ключа Person, например first_born_id и second_born_id, ссылающиеся на поля идентификаторов двух разных людей (в Person).Как мне установить отношения в торте?

Я думаю, что у Twin будет что-то вроде:

$belongsTo = array('FirstBorn' => array('className' => 'Person',
                                        'foreignKey' => 'firstborn_id'),
                   'SecondBorn' => array('className' => 'Person',
                                         'foreignKey' => 'secondborn_id'));

Но как мне настроить Person?Я мог бы сделать это так:

$hasOne = array('TwinAsFirstborn' => array('className' => 'Twin',
                                           'foreignKey' => 'firstborn_id'),
                'TwinAsSecondborn' => array('className' => 'Twin',
                                           'foreignKey' => 'secondborn_id'));

Но тогда, когда у меня есть Человек, и я хочу узнать о его близнеце, мне нужно будет проверить оба отношения.Я предполагаю, что я надеюсь, что есть способ получить отношения "близнецов" в Person, представляющие любой из двух способов, которыми человек может быть в отношениях близнецов.

Или есть лучший способ установить это?

Ответы [ 2 ]

1 голос
/ 05 января 2011

Я согласен с тем, что пример Близнецов немного сбивает с толку.Позвольте мне предположить, что у вас есть модель Product (Twin в вашем примере), и к ней всегда прикреплено 2 Component модели.

components: id - name
products: id - component1_id - component2_id

Я бы настроил Product следующим образом:

var $belongsTo = array(
    'Component1' => array(
        'className' => 'Component',
        'foreignKey' => 'component1_id'
    ),
    'Component2' => array(
         'className' => 'Component',
         'foreignKey' => 'component2_id'
    )
);

И Компонент как:

var $hasMany = array(
    'ProductWithComponentAsComponent1' => array(
        'className' => 'Product',
        'foreignKey' => 'component1_id'
    ),
    'ProductWithComponentAsComponent2' => array(
        'className' => 'Product',
        'foreignKey' => 'component2_id'
    )
);

По сути, вы должны заменить hasOne на hasMany.Каждый компонент имеет множество продуктов, где он является первым компонентом.В то же время у него есть много продуктов, где он является вторым компонентом.Надеюсь, что все проясняется.

РЕДАКТИРОВАТЬ 1: (О, и «ProductWithComponentAsComponent #» только для объяснения. Вы можете оставить любой короткий, приятный псевдоним, который вам нуженна ваших реальных моделях.)

РЕДАКТИРОВАТЬ 2: Простое практическое правило для использования отношений hasOne - используйте его, только когда вы разбиваете одну таблицу на несколько (например, Пользователь / Профиль)

РЕДАКТИРОВАТЬ 3: Если вы хотите, чтобы все продукты для компонента, вы можете сделать это двумя способами.

(A) Определите ForeignKey как false в вашемОтношение hasMany.

var $hasMany = array(
    'Product' => array(
        'className' => 'Product',
        'foreignKey' => false,
        'conditions' => array(
            'or' => array(
                "Product.component1_id = Component.id",
                "Product.component2_id = Component.id"
            )
        )
    )
);

(B) Если вышеуказанный метод не работает (Cake действует странно время от времени), вы также можете использовать соединение, чтобы заставить его подчиняться.Создайте функцию в модели компонентов следующим образом:

function fetchProducts($id) {
    if (!$id) {
        return null;
    }
    return $this->Product->find('all', array(
        'fields' => array('Product.*'),
        'joins' => array(
            array(
                'table' => 'components',
                'alias' => 'Component',
                'foreignKey' => false,
                'type' => 'inner',
                'conditions' => array(
                    'or' => array(
                        "Product.component1_id = Component.id",
                        "Product.component2_id = Component.id"
                    ),
                    'Component.id' => $id
                )
            )
        )
    ));
}
0 голосов
/ 05 января 2011

Почему вы определяете такого близнеца?

Близнец, первый или второй ребенок - это человек. То, что связывает их с родителями, это то, что они «дети», и их «DOB» одинаковы.

Так разве вы не сделаете что-то вроде:

Человек -> Я БЫ, Название, Возраст, DOB, PARENT_ID

parent_ID сохраняется в записи childs, а близнец определяется путем сравнения всех потомков по родительскому элементу для DOB?

Облегчает ли это установление отношений с cakePHP?

...