Я согласен с тем, что пример Близнецов немного сбивает с толку.Позвольте мне предположить, что у вас есть модель 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
)
)
)
));
}