Я работаю над приложением, данные которого импортированы из иностранного (и полностью неизменного) источника. Я упрощу некоторые таблицы, чтобы объяснить проблему. Ниже приведены таблицы с их первичными ключами.
invoices (doc_number, date_printed, batch_number)
headers (doc_number, date_printed, batch_number)
deliveries (doc_number, date_printed, batch_number)
transactions (doc_number, date_printed, batch_number, line_number)
messages (doc_number, date_printed, batch_number, line_number)
Таким образом, вы можете видеть, что Счета-фактуры, Заголовки и Доставки имеют отношения один-к-одному. Счета-фактуры к транзакциям и счета-фактуры к сообщениям - «один ко многим».
При импорте этих таблиц в мою собственную базу данных я изменил существующий первичный ключ на уникальный ключ и добавил поле auto_incrementing (id
) для каждой таблицы.
Теперь проблема заключается в настройке отношений в Cake, поскольку он вообще не обрабатывает составные ключи. Мне удалось заставить отношения «один к одному» работать так:
class Invoice extends AppModel {
public $name = "Invoice"
, $hasOne = array(
"Header" => array(
'foreignKey' => false,
'conditions' => array(
"Invoice.doc_number = Header.doc_number",
"Invoice.date_printed = Header.date_printed",
"Invoice.batch_number = Header.batch_number"
)
)
)
;
}
И это работает, потому что отношения один-к-одному запрашиваются за один раз с большим левым соединением. Попытка того же метода с отношением «один ко многим» (например, со счетами и транзакциями) прекращается, потому что Cake выполняет два запроса: первый, чтобы найти все соответствующие счета, а затем второй, чтобы найти все транзакции с соответствующим внешним ключ, соответствующий результатам первого запроса: (вот упрощенный запрос, который он пытается выполнить)
SELECT `Transaction`.* FROM `transactions` AS `Transaction`
WHERE `Invoice`.`doc_number` = `Transaction`.`doc_number`
AND `Invoice`.`date_printed` = `Transaction`.`date_printed`
AND `Invoice`.`batch_number` = `Transaction`.`batch_number`
Как видите, он не включается в счета, поэтому запрос умирает.
Любые идеи о том, как я могу сделать эту работу?