Potřebuju pomoct s vazbou mezi tabulkami
- t0x1c
- Člen | 151
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
- t0x1c
- Člen | 151
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
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
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
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
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
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.