použití klauzule related – popis chování
- Jarek92
- Člen | 91
Dobrý den, s nette teprve začínám, a po několika menších úspěších jsem narazil na problém. Při touze spojit dvě tabulky mi píše, že volám nedefinovanou metodu related(). Musím mít pro používání této klauzule zprovozněnou knihovnu NotORM? Pročítal jsem zde pár návodů, ale problém jsem nevyřešil.
Díky.
- Oli
- Člen | 1215
Důležité je mít v tabulce definovaný cizí klíč. Pak je vhodné mít
cizí klíč v konvenčním tvaru (tablka_id) takže např. tabulka
roles
bude mít v tabulce users cizí klíč role_id
.
Pak se z tabulky users na tabulku roles zeptáš:
$users = $this->connection->table('users')->wherePrimary(1)->fetch();
$users->role->name;
$users->role->id;
// ...
Pokud by jsi to chtěl naopak z roles do users:
$roles = $this->connection->table('roles')->wherePrimary(1)->fetch();
foreach($roles->related('user.role_id') as $users)
{
$users->name;
$users->id;
// ...
}
Psal jsem to z hlavy, možná to nebude přesně
- Jarek92
- Člen | 91
Děkuju za reakce.
Potřebuju propojit dvě tabulky:
Tabulka Sezony (id, nazev, od, do)
Tabulka Ubytovaci_ceny (id, obsazenost_chatky, cena_dospely, cena_vetsi_dite,
cena_mensi_dite, sezony_id)
Když jsem to zkoušel přes related, tak mi to prvně nešlo, pak jsem dal vyhledat jen jeden řádek dle ID a už to sice nespadlo, ale požadovaný výsledek se nepodařil.
Pak jsem zkusil dotaz:
$this->template->ceny = $this->database->table('ubytovaci_ceny')->where("sezony.nazev", 'Zima 2014');
A vyhodilo mi to chybu: PDOException #42S22 – > SQLSTATE[42S22]: Column not found: 1054 Unknown column ‚sezony.sezona_id‘ in ‚on clause‘
což při výsledném dotazu: SELECT ubytovaci_ceny
.* FROM
ubytovaci_ceny
LEFT JOIN sezony
ON
ubytovaci_ceny
.sezony_id
=
sezony
.sezona_id
WHERE
(sezony
.nazev
= ‚Zima 2014‘)
samozřejmě chápu. Ale nechápu, proč to vyplivlo sezony.sezona_id. Myslel sem, že když mám tabulku „sezony“, tak mám mít cizí klíč v tabulce jako „sezony_id“.
- Jarek92
- Člen | 91
Tak jsem to trochu předělal, jen si nevím rady s tím, jak dostat z SQL dotazu do šablony ta data (resp. pod jakými proměnnými).
Zde je kód:
Base:
<?php
namespace App;
use Nette;
class Base extends Nette\Object
{
/** @var Nette\Database\Connection */
protected $connection;
public function __construct(Nette\Database\Connection $connection)
{
$connection = new Nette\Database\Connection("mysql:dbname=solan;host=localhost", "root", "");
$this->connection = $connection;
}
public function vratEmaily(){
$this->connection->query('SELECT kontakty.hodnota FROM kontakty JOIN typy_kontaktu ON kontakty.typy_kontaktu_id = typy_kontaktu.id WHERE typy_kontaktu.nazev = "E-mail"');
}
public function vratTelefony(){
$this->connection->query('SELECT kontakty.hodnota FROM kontakty JOIN typy_kontaktu ON kontakty.typy_kontaktu_id = typy_kontaktu.id WHERE typy_kontaktu.nazev = "Telefon"');
}
public function vratSouradnice(){
$this->connection->query('SELECT kontakty.hodnota FROM kontakty JOIN typy_kontaktu ON kontakty.typy_kontaktu_id = typy_kontaktu.id WHERE typy_kontaktu.nazev = "GPS souřadnice"');
}
}
BasePresenter:
<?php
namespace App\Presenters;
use Nette,
App\Model;
/**
* Base presenter for all application presenters.
*/
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
/** @var \App\Base @inject */
public $base;
public function beforeRender()
{
$this->template->emaily = $this->base->vratEmaily();
$this->template->telefony = $this->base->vratTelefony();
$this->template->souradnice = $this->base->vratSouradnice();
}
}
A nakonec kus šablony, kde se mají data z SQL dotazu vypsat:
{foreach $emaily as $email}
<font class='horniKontakt'>{$email->hodnota}{sep}, {/sep}</font>
{/foreach}
Díky moc za rady.
- Mysteria
- Člen | 797
Minimálně ti tam chybí return v každé té metodě:
return $this->connection->query(...);
Za druhý, vytváříš v konstruktoru zbytečně instanci Connection, protože ji máš jako parametr konstruktoru. Tenhle řádek je zbytečnej:
$connection = new Nette\Database\Connection("mysql:dbname=solan;host=localhost", "root", "");
- Jarek92
- Člen | 91
Vyhodí to výjimku na tomto řádku:
{foreach $emaily as $email}
"Screen zde: ":http://atletikabv.cz/query.png
- thunderbuff
- Člen | 164
Jarek92 napsal(a):
Vyhodí to výjimku na tomto řádku:
{foreach $emaily as $email}
"Screen zde: ":http://atletikabv.cz/query.png
A nevoláš ten foreach vícekrát? Nad ResultSetem lze iterovat jen jednou.
Editoval thunderbuff (20. 2. 2014 0:38)