Вероятно, это очень простая проблема, но я не могу решить, как это правильно решить.
В моем приложении есть пользователи, у которых есть несколько адресов с разными целями. Например, пользователь может иметь адрес и адрес 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, но я никак не могу заставить его работать.
Если вы хотите добавить в свою пользовательскую таблицу соответствующие поля, то лучше добавить их в следующую форму 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',
)
);
Других решений пока нет …