Jak správně použít related u M:N vztahu

DefenestrationPraha
Člen | 99
+
0
-

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

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

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.

stepos2
Člen | 51
+
+1
-

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);
}
DefenestrationPraha
Člen | 99
+
0
-

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

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

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.

Pepino
Člen | 249
+
+1
-

Ve vazbové tabulce jsou oba sloupce klíč.

ALTER TABLE `traffic_traffic` ADD PRIMARY KEY (`traffic_id`,`binding_id`)
DefenestrationPraha
Člen | 99
+
0
-

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.

Pepino
Člen | 249
+
0
-

Table ‚traffic_traffic‘ does not have a primary key.

Vytvoří ti to v tabulce traffic_traffic primarní klič nad dvouma sloupci (traffic_id a binding_id).