Jak správně použít related u M:N vztahu
- DefenestrationPraha
- Člen | 127
Dobré odpoledne,
mám tabulky „traffic“, „files“ ve vztahu M:N a pak také tabulku „traffic_files“, ve které se udržuje M:N vztah. Cizí klíče jsou nastaveny.
Když mám vytaženu jednu řádku z Traffic, dejme tomu $traffic, nepodařilo se mi přijít na žádnou korektní syntaxi, jak zavolat
$traffic->related(...JAKÉ PARAMETRY ZADAT? ...)
abych získal Selection příslušných řádků z tabulky files. Jde to vůbec?
Zkoušel jsem různé kombinace jmen tabulek a klíčů, ale v nejlepším případě dostanu prázdnou selekci. Očividně něco nechápu, v dokumentaci jsem to nenašel…
Editoval DefenestrationPraha (20. 9. 2022 16:57)
- Mysteria
- Člen | 797
Vždyť je přesně tenhle příklad rovnou na první stránce v dokumentaci: https://doc.nette.org/…ase/explorer Jenom tam máš knížky a tagy spojené přes knížkotagy. :)
- DefenestrationPraha
- Člen | 127
Mysteria napsal(a):
Vždyť je přesně tenhle příklad rovnou na první stránce v dokumentaci: https://doc.nette.org/…ase/explorer Jenom tam máš knížky a tagy spojené přes knížkotagy. :)
Já se omlouvám, ale pořád mi to nefunguje. Když zavolám něco takového:
`
php
foreach ($row->related(‚vazbova_tabulka‘) as $dependency)
`
{
tak se mi v tom cyklu vracejí iterované řádky z té vazbové tabulky a ne z té cílové. Jako kdyby ten příkaz related nechtěl pochopit, že chci řádky rovnou z té další tabulky.
- DefenestrationPraha
- Člen | 127
stepos2 napsal(a):
Vždyť mu nedáváš žádnou informaci o cílové tabulce, tak jak by to mohl pochopit?
foreach ($row->related('vazbova_tabulka') as $dependency) { dump($dependency->cilova_tabulka); }
Aha. Děkuji.
- DefenestrationPraha
- Člen | 127
stepos2 napsal(a):
Vždyť mu nedáváš žádnou informaci o cílové tabulce, tak jak by to mohl pochopit?
foreach ($row->related('vazbova_tabulka') as $dependency) { dump($dependency->cilova_tabulka); }
Tak přece jenom ještě úplně nerozumím celé věci.
foreach ($oldRow->related(DbTable::TRAFFIC_TRAFFIC, DbCol::COLUMN_TRAFFIC_ID) as $dependency) {
$dependencyRow = $dependency->{DbTable::TRAFFIC_TABLE_NAME};
Teď mi to říká
Table ‚traffic_traffic‘ does not have a primary key.
Což opravdu nemá, je to M:N vazbová tabulka bez primárních klíčů. Ono je to asi komplikováno ještě tím, že jde o vazby uvnitř jedné tabulky traffic, ne mezi dvěma tabulkami.
Editoval DefenestrationPraha (14. 11. 2022 8:56)
- DefenestrationPraha
- Člen | 127
Já to raději popíšu do detailů.
Mám tabulku Traffic, jejíž jednotlivé řádky nějak popisují přijatá a odeslaná data. Určité řádky mají vazby na jiné řádky, a to charakteru M:N.
Proto mám i tabulku Traffic_Traffic, která vypadá takto:
CREATE TABLE IF NOT EXISTS `traffic_traffic` (
`traffic_id` bigint,
`binding_id` bigint,
FOREIGN KEY (traffic_id) REFERENCES traffic(id),
FOREIGN KEY (binding_id) REFERENCES traffic(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Chtěl bych vzít řádku a zkopírovat pomocí related její dependence, ale nemůžu přijít na to, jak to udělat. Zatím to mám takto:
foreach ($oldRow->related(DbTable::TRAFFIC_TRAFFIC, DbCol::COLUMN_TRAFFIC_ID) as $dependency) {
$deepCopy = $this->getTraffic($dependency->{DbCol::COLUMN_BINDING_ID})->toArray();
Ale docela rád bych si to další getTraffic(id) ušetřil a získal rovnou tu řádku.
- DefenestrationPraha
- Člen | 127
Pepino napsal(a):
Ve vazbové tabulce jsou oba sloupce klíč.
ALTER TABLE `traffic_traffic` ADD PRIMARY KEY (`traffic_id`,`binding_id`)
Musím přiznat, že toto je tak stručné, že tomu nerozumím. Rád bych věděl, co dělám, než to udělám.