Diskuze: Spojení dvou tabulek
Člen
Zobrazeno 13 zpráv z 13.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
Ahoj,
pokud jednu knihu může číst více čtenářů, pak to bude vazba M:N, kdy si uděláš tzv. vazební tabulku:
[kniha_ctenar] (
id,
kniha_id,
ctenar_id
)
Dále popravdě moc nevím, co přesně chceš. Pokud chceš select se čtenáři do formuláře, vyhledáš si všechny čtenáře a v každém tom optionu jako 'value' bude ID čtenáře a jméno uvidíš v tom seznamu.
Díky moc za odpověď.
Můj první problém je, že nevím jak vytvořit vazební tabulku... Musím to
v phpmyadmin nějak nastavovat ? propojovat atd ?
A ostatní zkusím vysvětlit lépe:
Budu mít stránku, kde bude formulář ve kterém bude možno zadat: jmeno
knihy, rok knihy a poté zde bude 5 selectboxů, kde budou na vyber jmena
ctenaru z tabulky ctenar (těchto jmen bude v každém selectboxu 10 a můžou
se opakovat) - to znamená, že tabulka user obsahuje 10 jmen
Tady nastává problém, že při odeslání formulář nevím co mám dělat s
tima selectboxama, kam je mám ukládat atd..
Druhá část stránky bude už jen pro výpis z databáze - který taky
přesně nevím jak províct ale to až déle.. Ted je pro mě hlavní to
uložení a propojení tabulek
A jenom mě napadlo nejedná se spíše o 1:N ?
Teoreticky nic víc, než udělat tu vazební tabulku se třemi sloupci, nemusíš, jen je obvykle lepší tomu nastavit i cizí klíče, aby ti tam nevznikl bordel.
V tom kódu bych to řešil tak, že budeš mít klasicky formulář, ve kterém ty selectboxy budou jako pole, tzn.:
// zde si musíš vyhledat ty čtenáře tak, abys měl pole ve tvaru ID čtenáře => jméno, tzn. třeba
$ctenari = array(
1 => "Jméno 1",
2 => "Jméno 2",
3 => "Jméno 3",
...
);
<input type="text" name="nazev_knihy" />
<input type="text" name="rok_knihy" />
// tady si těch pět selectů můžeš vytvořit cyklem, každému z nich pak cyklem uděláš ty optiony
for ($i = 0; $i < 5; $i++) {
<select name="ctenari[]">
foreach ($ctenari as $id => $jmeno) {
<option value="$id">$jmeno</option>
}
</select>
}
Tím, že budeš mít selecty jako pole (tzn. v tom name budou na konci ty hranaté závorky), tak to v proměnné $_POST pak dostaneš jako:
$_POST["ctenari"] = array(
ID z prvního selectu,
ID z druhého selectu,
ID z třetího selectu,
...
)
No a cílem je, že ten název a rok knihy vložíš (INSERT) do tabulky 'kniha', zjistíš si její ID (databáze umí získat poslední vložené ID, nevím, jaký ovladač používáš), pak projedeš ty čtenáře a vložíš je do té vazební tabulky.
foreach ($_POST["ctenari"] as $id) {
INSERT INTO kniha_ctenar (kniha_id, ctenar_id)
VALUES ($knihaId, $id);
}
Popsal jsem to hodně zjednodušeně, snad to z toho nějak pochopíš. Nevím, kam až ses v PHP dostal
Díky moc vypadá to dobře zkusím to nějak udělat jenom jsem zapomněl říct že to dělám v nette takže se ten kód bude lišit ale nějak to zkusím udělat dííky moc dám vedět
Tk se nepovedlo... Jak dělam v tom Nette tak tam je to trošku jiný a jsem prostě uplně ztracenej...
Jelikož to asi nebude nic důležitýho, tak nebudu řešit, že tam ten select opakuju ručně 5x.
class HomepagePresenter extends BasePresenter
{
/** @var Nette\Database\Context @inject */
public $db;
public function actionDefault()
{
$usersItems = $this->db->table("user")->fetchPairs("id", "name");
$form = $this["bookForm"];
$form["user1"]->setItems($usersItems);
$form["user2"]->setItems($usersItems);
$form["user3"]->setItems($usersItems);
$form["user4"]->setItems($usersItems);
$form["user5"]->setItems($usersItems);
}
public function createComponentBookForm()
{
$form = new Form();
$form->addText("bookName", "Název knihy")
->setRequired(TRUE);
$form->addText("bookYear", "Rok knihy")
->setRequired(TRUE);
$form->addSelect("user1", "Čtenář 1");
$form->addSelect("user2", "Čtenář 2");
$form->addSelect("user3", "Čtenář 3");
$form->addSelect("user4", "Čtenář 4");
$form->addSelect("user5", "Čtenář 5");
$form->addSubmit("submit", "Odeslat");
$form->onSuccess[] = array($this, "bookFormSubmitted");
return $form;
}
public function bookFormSubmitted(Form $form, $values)
{
$book = $this->db->table("book")->insert(array(
"name" => $values->bookName,
"year" => $values->bookYear
));
// toto 5x to samé, jen s user1, user2, user3, user4, user5
$this->db->table("book_user")->insert(array(
"book_id" => $book->id,
"user_id" => $values->user1
));
$this->db->table("book_user")->insert(array(
"book_id" => $book->id,
"user_id" => $values->user2
));
// zbylé inserty
$this->flashMessage("Kniha byla uložena", "success");
$this->redirect("this");
}
}
// v šabloně pak stačí jen
{control bookForm}
Zkušení uživatelé mi jistě prominou, že cpu databázi do presenteru a že mám všech pět selectboxů psaných ručně.
Edit:
Toto řešení předpokládá takovou strukturu tabulek:
[book] (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR,
year VARCHAR / INT -- to je fuk
),
[user] (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR
),
[book_user] (
id INT PRIMARY KEY AUTO_INCREMENT,
book_id INT,
user_id INT
)
Strašlivě ti děkuju ! Funguje to ! Fkt moc dík... Kdyby si měl chvilku napsal by si mi prosím jk se ty prvky z tý databáze vypíšou ?
Jméno, Rok a Ctenare všechny normálně v tabulce třeba
Umíš udělat cizí klíče v těch tabulkách v databázi?
A omlouvám se nemá tam bejt project_id ale book_id
Udělal jsem to pomocí tohoto příkazu: ALTER TABLE book_user
ADD
FOREIGN KEY ( book_id
) REFERENCES book
(id
);
Zobrazeno 13 zpráv z 13.