použití klauzule related – popis chování

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

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.

s4muel
Člen | 92
+
0
-

NotORM nie je potrebna. ukaz kod, kde volas ten related()

Oli
Člen | 1215
+
0
-

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

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

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

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

Skvělé, děkuju. Nyní to hází chybu: Nette\InvalidStateException → Nette\Database\ResultSet implements only one way iterator.

Poradí mi někdo, jak po vrácení SQL dotazu z klauzule query pracovat s řádky/sloupci výsledku? Děkuju.

Mysteria
Člen | 797
+
0
-

Ten kus ze šablony, co jsi sem dával, by měl bez problémů fungovat. Na jakým řádku ti to hází tuhle chybu?

Jarek92
Člen | 91
+
0
-

Vyhodí to výjimku na tomto řádku:

{foreach $emaily as $email}

"Screen zde: ":http://atletikabv.cz/query.png

thunderbuff
Člen | 164
+
0
-

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)