Nette\Database left join na tabulku se dvema FK
- saimons
- Člen | 293
Ahoj, prosim o radu. Mam takovyto jednoduchy SQL dotaz, kde jsou dve tabulky: stadion a stadionvar (je to neco jako sablona) a v tabulce stadion jsou dva FK, ktere ukazuji na tab stadionvar. Driv mi fungoval tento dotaz:
$stadionDone = $this->database->table('stadion')->where('tym_id', $tym_id)->order('stadionvarakt.poschodi, stadionvarakt.sektor');
ktery vygeberoval:
SELECT `stadion`.`id`, `stadion`.`stadionvarakt_id`, `stadion`.`stadionvarvys_id`, `stadion`.`barva`
FROM `stadion`
LEFT JOIN `stadionvar` AS `stadionvarakt` ON `stadion`.`stadionvarakt_id` = `stadionvarakt`.`id`
WHERE (`tym_id` = 1)
ORDER BY `stadionvarakt`.`poschodi`, `stadionvarakt`.`sektor`
Potreboval jsem udelat zmenu v projektu a pristupuju ted do dvou databazi a
prestalo mi to fungovat. Konkretne se mi generuje SQL dotaz bez aliasu
stadionvarakt
. Drive jsem injectoval Nette\Database\Context
v modelu. Ted to resim takto a neni mi jasne jak to na to muze mit vliv a nebo
zda je naka jina cesta.
Tady je jak se pripojuji do DB:
config.neon
nette:
database:
stadion:
dsn: '%database.stadion.driver%:host=%database.stadion.host%;dbname=%database.stadion.dbname%'
user: %database.stadion.user%
password: %database.stadion.password%
services:
#Database
- Model\Database\stadion( @nette.database.stadion )
Model\Database\stadion.php
namespace Model\Database;
use Nette\Database\Context,
Nette\Database\Connection;
class stadion {
/**
* @var Nette\Database\Context
*/
private $database;
/**
* @param Nette\Database\Connection $connection
*/
public function __construct(Connection $connection) {
$this->database = new Context($connection);
}
/**
* @return Nette\Database\Context
*/
public function getContext() {
return $this->database;
}
}
model
/** @var \Nette\Database\Context */
private $database;
/**
*
* @param \Model\Database\stadion $database
*/
public function __construct(\Model\Database\stadion $database) {
$this->database = $database->getContext();
}
- David Matějka
- Moderator | 6445
Injectuj do „stadion“ context. Pokud mas pouze jedno spojeni na databazi, staci uvest typehint a nette to autowiruje. Pokud mas vice spojeni, uprav neon na
- Model\Database\stadion( @nette.database.stadion.context )
- David Matějka
- Moderator | 6445
Zmena je v tom, ze injectujes rovnou Context, ktery vytvorilo Nette a ne pouze Connection. Kdyz se kouknes na konstruktor Contextu, tak ma povinny pouze jeden parametr – Connection. A tak jsi to vytvarel – bez tech dalsich parametru. Ale nette nastavuje i cacheStorage a reflection, ktere je prave dulezite pro spravnou funkcnost joinovani.
Editoval matej21 (11. 6. 2014 11:11)