Doku k logice párování cizích klíčů při JOINu
- rerege
- Člen | 58
Tak jsem včera vyřešil nastavení cizích klíčů v db, ale nefunguje mi to, jak bych si představoval
z tohoto
$importProductsPhotos = $this->database->table('import_products_photos')
->select('import_products_photos.*, product.product_id')
->where('uploaded', '0');
mi udělá toto, chyba je zde: = product.product_id tam potřebuji = product.note1
SELECT import_products_photos.*, product.product_id, product,title
FROM import_products_photos
LEFT JOIN product ON import_products_photos.key_product_note1 = product.product_id
WHERE (uploaded = ‚0‘)
přičemž vazbu cizích klíčů mám takto:
FOREIGN KEY (key_product_note1) REFERENCES product (note1)
stále mi místo note1 (což je VARCHAR(45)) pracuje s product_id
V dokumentaci je odkaz na logiku párování cizích klíčů, ale skočí
to na ten samý příspěvek, takže kde nic tu nic
Chudák @DavidMatějka to tady vysvětloval tisíckrát, přesto jsem to
nijak neposkládal.
Prosím, nevíte co dělám špatně?
- Pavel Kravčík
- Člen | 1196
Myslím, že si budeš muset pohrát tady s tím… https://github.com/…ventions.php –
nám často zlobily prefixy tabulek, protože máme např. tabulku
mor_mortgage
, ale v jiných tabulkách jen mortage_id
místo „očekávané“ mor_mortgage_id
.
Editoval Pavel Kravčík (5. 10. 2017 12:43)
- David Matějka
- Moderator | 6445
kdyz koukam na tu implementaci, tak to vypada, ze to vzdy joinuje z FK na PK, takze s tim asi nic neudelas. neslo by upravit strukturu db, aby v import_products_photos bylo product_id?
- rerege
- Člen | 58
No v tomto případě mi jde i o princip, neb toto teď řeším neustále, je někde popsaná ta logika párování cizích klíčů? Vím, že jsi to tady ve fóru jednou detailně popisoval, ale nemohu to najít – nebo lépe, je to popsané v dokumentaci?
A s tou úpravou, která mě nemine, toť otázka – jde o import
produktů a fotografií do eshopu…
momentálně mi zákazník připravil 1. tabulku s produkty,
popisem atd. kde je i katalogové číslo (teoreticky to
příště může být jakékoli interní číslo, takže proto to trapné
označení note1
a k tomuto číslu pak (často později) dodají 2.tabulku se
sloupcem kat.číslo a jména souborů
s fotografiemi produktu
A já nechci ty lidi nutit, aby mi ty fotky místo toho katalogového čísla
přiřazovali k product_id, které se mi vygeneruje v databázi. Šlo by to
asi pak předělat třeba v excelu, ale proč se pokaždé s tím
otravovat…
Nebo jak to řešíte Vy? Omlouvám se, toto přímo už
nesouvisí s Nette, ale jsem nyní donucen, přemýšlet o alternativě a
jistě nejsem první na světe, kdo toto řeší…
Editoval rerege (5. 10. 2017 21:22)
- norbe
- Backer | 405
Co ti brání si ta data před uložením normalizovat, tzn. nahradit katalogové číslo za produkt id? Přeci neznamená, že když chceš mít v db product_id, že ho musíš chtít i po uživateli…
Nebo když už to máš navržené takhle, můžeš si to prostě natáhnout pomocí dvou dotazů místo jednoho..
$importProductsPhotos = $this->database->table('import_products_photos')
->select('import_products_photos.*, product.product_id')
->where('uploaded', '0');
$products = $this->database->table('product')
->where('note1', array_values(importProductsPhotos->fetchPairs('key_product_note1', 'key_product_note1'))
->fetchPairs('note1');
foreach($importProductsPhotos as $photo) {
$product = $product[$photo->key_product_note1];
// cokoli potřebuješ
}
- rerege
- Člen | 58
- @norbe moc díky… a co myslíš tou normalizací (jako v Nette nebo jiným nástrojem upravit soubiry ještě před importem?
mě jinak šlo i pochopení, jak si Nette ty klíče páruje (pořád mi schází nějaký popis – nějaký náznak vidím v tóm kódu co včera postnul @PavelKravčík, ale moc tomu ještě nerozumím… zatím mi to tak přijde, že pokud člověk nepoužívá PK tak si koleduje o problém.
Editoval rerege (6. 10. 2017 15:07)
- norbe
- Backer | 405
Normalizací myslím to, aby jsi ty data upravil ve vlastním kódu před uložením hodnot. Nevím jestli zdroj dat je nějaký formulář, excel nebo něco jiného ale to je jedno, vždycky je nějaké místo v tvém kódu, kde vezmeš jeden řádek a uložíš ho do databáze.
A místo aby jsi udělal jen:
$database->table('import_products_photos')->insert($row);
Uděláš něco jako:
$product = $database->table('product')->where('note1', $row->key_product_note1)->fetch();
$row->product_id = $product->id;
$database->table('import_products_photos')->insert($row);