Vytvoření připojení k více databázím

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

Zdravím,

Potřeboval bych pomoci, hledám již dlouhou dobu a nemůžu to zprovoznit.

Potřeboval bych v neonu nastavit více připojení.

Pokud však vytvořím v neonu tento setting, dostávám od tracy

Unknown configuration option database.default.dotazy, database.default.dotazy2.

database:
	dotazy:
		dsn: 'mysql:host=127.0.0.1;dbname=dotazy'
		user: root
		password: *****
	dotazy2:
		dsn: 'mysql:host=127.0.0.1;dbname=dotazy2'
		user: root
		password: *****

Můžete prosím poradit a napsat, jak bych implementoval toto nastavení?

CZechBoY
Člen | 3608
+
0
-

Takhle to je dobře – používám to stejně.
Smazal si cache od Nette.Configurator po aplikaci změn?
Jak si tyhle spojení předáváš do modelu? - App\MujModel(@database.dotazy.context)

milda001
Člen | 6
+
0
-

Díky,

Problém byl ve střetu local.neon a neon pro produkční server.

Nyní trochu bojuji s modelem v neonu mám:

database:
    dotazy:
        dsn: 'mysql:host=127.0.0.1;dbname=dotazy'
        user: root
        password: *****
    dotazy2:
        dsn: 'mysql:host=127.0.0.1;dbname=dotazy2'
        user: root
        password: *****

- App\Model\Dotazy(@database.dotazy.context)
- App\Model\Objednavky(@database.objednavky.context)

jakým způsobem můžu přes konstruktor nyní přistoupit k jedné nebo druhé dadabázi?
Koukal jsem se do containeru, zde se vytvoří pole s objemi databázemi, ale přes konstruktor se mi předá pouze první připojení. Jak se dostanu na druhé?

Předem díky za odpověď

CZechBoY
Člen | 3608
+
0
-

Předáš si i druhé :-)

services:
	- App\Model\Dotazy(@database.dotazy.context, @database.dotazy2.context)
sventek
Backer | 16
+
0
-

Ahoj,

mám stejný problém – config mám stejně, ale funguje to tak, že obě připojení se koukají do stejné databáze. Mohl bych vás někoho poprosit o kontrolu modelu?

<?php
class BaseModel extends Nette\Object
{
    /** @var Nette\Database\Context @inject*/
    public $db1;

    /** @var Nette\Database\Context @inject*/
    public $db2;

    public function __construct(Nette\Database\Context $db1, Nette\Database\Context $db2)
    {
        $this->db1 = $db1;
        $this->db2 = $db2;
    }
}
?>

Když pak volám

<?php
$this->db1->table('users')->where('id = 1')->fetch();
?>

tak mi to křičí, že tabulku users nezná – a přitom tam určitě je. Zkusil jsem si vypsat u obou připojení

<?php
$this->db1->getConnection()
$this->db2->getConnection()
?>

a vážně kouká do stejné databáze …

Nevíte někdo, kde může být chyba prosím?

Oli
Člen | 1215
+
0
-

Jak to mas registrovaný v config.neon?

sventek
Backer | 16
+
0
-

V configu mám:

database:
    db1:
        dsn: 'mysql:host=127.0.0.1;dbname=db1'
        user: root
        password:
        autowired: true
        options:
            lazy: yes
    db2:
        dsn: 'mysql:host=127.0.0.1;dbname=db2'
        user: root
        password:
        autowired: false
        options:
            lazy: yes

services:
	- App\Model\Servis(@database.db1.context, @database.db2.context)

Editoval sventek (10. 7. 2016 9:18)

CZechBoY
Člen | 3608
+
0
-

@sventek jestli jedes na produkcnim rezimu tak smaz cache Nette.Configurator

Btw ten inject dej pryc – injektujes (doufam) konstruktorem

sventek
Backer | 16
+
0
-

@CZechBoY Chápu to dobře, že smažu složku cache v tempu? To jsem udělal a beze změny. Inject jsem dal pryč – ano, je to v konstruktoru.

Každopádně se mi podařilo najít funkční stav, kdy dám do každého modelu právě jedno připojení. Nakonec mě to aspoň donutí si to líp rozvrhnout, aby nebylo všechno všude, ale co třída modelu, to jedno připojení…

CZechBoY
Člen | 3608
+
0
-

@sventek jeste se mi nestalo, ze bych potreboval obe pripojeni k db. Pokud potrebuju fakt pracovat s obema db tak to uz radsi predam repozitar do repozitare.

sventek
Backer | 16
+
0
-

@CZechBoY máš recht, s jedním připojením je to čistší a logičtější. Víc mě štvalo, že mi neni vůbec jasné, proč to nejede, když se mi tam zdálo všechno v pořádku :)