Doku k logice párování cizích klíčů při JOINu

rerege
Člen | 58
+
0
-

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ě?

David Matějka
Moderator | 6445
+
0
-

ukaz prosim cele schema tech dvou tabulek (vcetne cizich klicu)

rerege
Člen | 58
+
0
-

promiň…
zde je schéma: https://prnt.sc/gtj9af

Pavel Kravčík
Člen | 1180
+
+1
-

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)

CZechBoY
Člen | 3608
+
+1
-

@PavelKravčík ale on zatím nejspíš používá DiscoveredConvetion

rerege
Člen | 58
+
0
-

Vy klucí nemluvit jazykem mého kmene…

David Matějka
Moderator | 6445
+
0
-

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
+
0
-

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
+
+1
-

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
+
0
-
  1. @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
+
0
-

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);