Свяжите одну и ту же модель дважды с другой моделью в CakeStack Overflow

Вероятно, это очень простая проблема, но я не могу решить, как это правильно решить.

В моем приложении есть пользователи, у которых есть несколько адресов с разными целями. Например, пользователь может иметь адрес и адрес InvoiceAddress. Я хочу сохранить оба адреса в одной таблице (модель адресов), а затем назначить их одному пользователю.

Соответствующие модели выглядят примерно так:

Адрес:

 public $belongsTo = array(
'Address' => array(
'className' => 'Address',
),
'InvoiceAddress' => array(
'className' => 'Address',
),
);

И Пользователь:

public $hasOne = array(
'Address' => array(
'className' => 'Address',
),
'InvoiceAddress' => array(
'className' => 'Address',
),
);

Когда у пользователя будет один адрес, я добавлю user_id в качестве внешнего ключа в модель Address и покончу с этим. Но, очевидно, что-то должно быть сделано по-другому, чтобы CakePhp мог различать адрес и адрес счета.

На мой взгляд, решение заключается в добавлении address_id и invoice_address_id в таблицу User, но я никак не могу заставить его работать.

1

Решение

Если вы хотите добавить в свою пользовательскую таблицу соответствующие поля, то лучше добавить их в следующую форму address_user_id и invoice_address_user_id, Тогда в вашей пользовательской модели должно быть отношение ownTo, которое выглядит следующим образом:

public $belongsTo = array(
'Address' => array(
'className' => 'Address',
'foreignKey' => 'address_user_id',
),
'InvoiceAddress' => array(
'className' => 'Address',
'foreignKey' => 'invoice_address_user_id',
),
);

Поэтому при выполнении следующей команды $this->User->find('all'); результат будет

$result = array(0 =>
array('User' => array(...),
'Address' => array(...), // it will bring only one address row
'InvoiceAddress' => array(...) // it will bring only one address row
),
1 => ...
2 => ...
);

Тогда в вашем адресе модели отношения, которые вы должны добавить:

public $hasOne = array(
'User' => array(
'className' => 'User',
'foreignKey' => 'address_user_id',
),
'InvoiceUser' => array(
'className' => 'User',
'foreignKey' => 'invoice_address_user_id',
)
);
2

Другие решения

Других решений пока нет …