Ben bir yabancı (ve tamamen değişmez) kaynağından alınan verileri olan bir uygulama üzerinde çalışıyorum. Ben sorunu açıklamak için bazı tabloların basitleştirmek olacak. Aşağıda onların birincil anahtarlar ile tablolardır.
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)
Yani Faturalar, Başlıkları ve Teslimatlar One-to-One ilişkileri olduğunu görebilirsiniz. Faturalar-İşlemler-ve Faturalar-to-iletileri One-çok vardır.
Benim kendi veritabanına bu tabloları ithal, ben bir benzersiz anahtar olarak varolan bir birincil anahtar değiştirdim ve her masada (id
) bir auto_incrementing alan eklendi.
Gerçekten de tüm kompozit tuşları işlemez beri Şimdi sorun, Kek ilişkiler kuruyor. Ben bu gibi çalışan One-to-One ilişkileri almak mümkün oldum:
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"
)
)
)
;
}
Bire bir ilişkilerde büyük bir SOL JOIN ile tek seferde sorgulanan çünkü bu, çalışıyor. Tüm eşleşen Faturalar bulmak için ilk ve daha sonra ikinci bir gelen yabancı tüm İşlemler bulmak için: (Faturalar ve İşlemler ile örneğin) bir-çok ilişkisi ile aynı yöntemi deneyerek Kek iki sorgu yapar, çünkü, ölür İlk sorgudan sonuç eşleşen anahtar: (burada çalıştırmak için çalışıyor basitleştirilmiş sorgu)
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`
Sen sorgu ölür böylece faturalar üzerine katılarak değil, görebiliyorum.
Ben bu işi yapmak nasıl hakkında herhangi bir fikir?