Potřebuju pomoct s vazbou mezi tabulkami

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
t0x1c
Člen | 151
+
0
-

Zdravím dělam si jeden malý projekt. Mám dvě tabulky trade a trade_items. Jde o to že mam trade a v tom mam zakladní informace jako id uživatele čas založení atd.. A v trade_items už jsou položky přiřazene k tomu tradu. Prvni přidavam itemy ktere se mi ukladaji do mezi tabulky a pote když kliknu vytvořit tak se mi přida trade a položky zapišou do te databaze trade_items a k tomu mam v trade_items sloupeček trade_id. No a ja potřebuju když budu vypisovat ten trade tak abych nějakou vazbou mohl vypsat i všechny jeho trade_itemy. Snad jsem to napsal srozumitelně a moc se nezamotal :D. Damozdřejmě jsem zkusil udělat vazbu ID tradu se sloupečkem trade_id z tabulky trade_items ale to nejde protože prvni se vytvoří trade_itemy a až pak trade. :D Ja vím je to zamotane.. Předem díky

vvoody
Člen | 910
+
0
-

Najskorej vytvor trade.

t0x1c
Člen | 151
+
0
-

No to ja dělám ale řve mi to že nemam žádne trade_items a tim padem nemuže byt relace. Nebo to chapu špatně? Vazba a relace je něco jineho? Ja vytvařím klíč a potom relaci v phpmyadmin.

vvoody
Člen | 910
+
0
-

Čo ti řve? Nevidím žiadny kus kódu + db dump + Exception message

t0x1c
Člen | 151
+
0
-

PDOException #23000

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (gethostcz9.trade, CONSTRAINT trade_ibfk_1 FOREIGN KEY (id) REFERENCES trade_items (trade_id))

public function handleAddTrade() {
        $this->trade_have = $this->trade_temp->vypsatItemy($this->user->getIdentity()->id, 'have');
        $this->trade_want = $this->trade_temp->vypsatItemy($this->user->getIdentity()->id, 'want');

        $trade = $this->tradeRepository->addTrade($this->user->getId());

        foreach ($this->trade_have as $have) {
            if ($have->backpack_items_id !== 1) {
                $backpack_id = $have->backpack_items_id;
                $items_id = 1;
            } else {
                $items_id = $have->items_id;
                $backpack_id = 1;
            }
            $this->tradeItemsRepository->addToTrade_items($items_id, $this->user->getIdentity()->id, 1, $have->exterior, $have->stattrak, 'have', $backpack_id, $trade);
        }

        foreach ($this->trade_want as $want) {
            if ($want->backpack_items_id !== 1) {
                $backpack_id = $want->backpack_items_id;
                $items_id = 1;
            } else {
                $items_id = $want->items_id;
                $backpack_id = 1;
            }
            $this->tradeItemsRepository->addToTrade_items($items_id, $this->user->getIdentity()->id, 1, $want->exterior, $want->stattrak, 'want', $backpack_id, $trade);
        }
        $this->trade_temp->deleteUserTemp($this->user->getIdentity()->id);
        $this->redirect('this');
    }

Kod

jiri.pudil
Nette Blogger | 1032
+
0
-

Ten cizí klíč by měl být definovaný na trade_items.trade_id a ukazovat na trade.id. Ty to máš obráceně.

A ano, vazba a relace jsou dvě rozdílné věci.

t0x1c
Člen | 151
+
0
-

Jj vim protože ja chci vypisovat Trade a k tomu trade_items. Jelikož když vypišu pomoci foreach trade_items tak to nemam podle čeho vypisovat. Protože každy trade ma max 16 trade_itemu a z toho pulka je have a pulka want :D Jestli mě teda chapeš takže potřebuju prostě udělat to že vypišu trade a k němu vypišu pomoci foreach jeho itemy. Jde to nějak? nebo budu muset překopat db nebo ten kod?
Nebo to jde vypsat pomoci vazby trade_items.trade_id > trade.id?

Editoval t0x1c (11. 10. 2013 19:52)

s4muel
Člen | 92
+
0
-

toto bude asi to, co potrebujes: (zdroj https://doc.nette.org/en/database)

$parent = $child->ref($tableName);
//ref() vs. related()
$tableChildren = $parent->related($tableName);

a tym padom mozes upravit cudzi kluc, ako ti radil jiri a potom pri vypisovani si vytiahnes trade a k tomu trade_items pomocou related()

Editoval s4muel (14. 10. 2013 8:53)

t0x1c
Člen | 151
+
0
-

To už jse vyřešil dík :)
$trade->related(‚trade_items‘, ‚trade_id‘)
Takhle. Ale mám další problem.

Mám tabulku trade a v ní:
id, user_id, closed, description

A tabulku users a v ní:
id, name, avatar, steamid

A potřebuju abych když vypisuju trade měl vazbu mezi user_id a steamid. Jestli to správně chapu jsou to dva cizí klíče.

s4muel
Člen | 92
+
0
-

preco dva cudzie kluce? steamid je cudzi kluc na nejaku dalsiu tabulku alebo len nejaky „string“ so steam id toho pouzivatela?
ak je to len string, tak v db budes mat spraveny cudzi kluc trade.user_id, ktory bude ukazovat na users.id a potom pri vypisovani trade len spravis:

$trade->ref('users')->steamid
//resp. skratene
$trade->users->steamid

pozri ten link vyssie, co som posielal, tam su pekne priklady aj s obrazkom.