Nette\Database left join na tabulku se dvema FK

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

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

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 )
saimons
Člen | 293
+
0
-

Dekuji, ted to funguje. Mam dve spojeni do DB. Ale popravde nevim v cem se vlastne udala zmena?

David Matějka
Moderator | 6445
+
0
-

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)