Použití dvou databází v modelu

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

Ahoj, ptám se na správné nastavení configu a připojení ke dvoum databázím… momentálně, když volám spojení ke druhé databázi, tak pořád se dotazuji nad tou první

config.local.neon

parameters:


database:
        clients:
            dsn: 'mysql:host=127.0.0.1;dbname=clients'
            user: root
            password:
            options:
                lazy: yes
        local:
            dsn: 'mysql:host=127.0.0.1;dbname=local'
            user: root
            password:
            options:
                lazy: yes

config.neon

#
# SECURITY WARNING: it is CRITICAL that this file & directory are NOT accessible directly via a web browser!
#
# If you don't protect this directory from direct web access, anybody will be able to see your passwords.
# https://nette.org/en/security-warning
#
parameters:


php:
	date.timezone: Europe/Prague


nette:
	application:
		errorPresenter: Error
		mapping:
			*: App\*Module\Presenters\*Presenter

	session:
		expiration: 14 days


services:

        - App\Model\HomeModel
        router: App\RouterFactory::createRouter

BaseModel

class BaseModel extends \Nette\Object {
    protected $masterDb;
    protected $localDb;

    public function __construct(\Nette\Database\Context $clients, \Nette\Database\Context $local) {
        $this->masterDb = $clients;
        $this->localDb = $local;


    }
}

Editoval mara11 (31. 1. 2015 11:11)

Oli
Člen | 1215
+
0
-

Musíš si tam totiž předat o jakou databázi se jedná viz.: připojení do dvou databází. Jinak ti to tam hodí vždycky hodí jen jednu. Myslím, že tu první, že je považovaná za defaultní.

mara11
Člen | 42
+
0
-

Takhle to tedy přidat v services?
V tom případě: Reference to missing service ‚nette.database.clients‘. search►

services:
        clients: @nette.database.clients
        local: @nette.database.local
        - App\Model\HomeModel
        router: App\RouterFactory::createRouter
Oli
Člen | 1215
+
0
-

To bylo pro starou verzi nette, kde byla database pod nette. Ve verzi 2.2 se Nette rozsekalo na balíčky a database už se nenastavuje jako součást Nette. Takže by to mělo být zhruba takhle:

services:
	clients: @database.clients
	local: @database.local
	- App\Model\HomeModel(@clients, @local)
mara11
Člen | 42
+
0
-

Už jsme se někam posunuli, @database.clients apod. je správně, akorát se má používat už Context a ne Connection ne?
Argument 1 passed to App\Model\HomeModel::__construct() must be an instance of Nette\Database\Context, instance of Nette\Database\Connection given…

Editoval mara11 (31. 1. 2015 12:02)

mara11
Člen | 42
+
0
-

nebo si mám v konstruktoru předat \Nette\Database\Connection $clients

a pak $context = new \Nette\Database\Context($clients);
to mi ale přijde, že je přesně příklad toho jak se to nemá dělat… (každopádně, když to tak udělám, tak mi to funguje, ale nechci to takhle divně, když je určitě lepší řešení :-D )

Oli
Člen | 1215
+
0
-

Určitě by to mělo jít z neonu. Máš pravdu, chce to tam předat context. Píšu z hlavy, ale můžeš zkusit něco jako:

services:
    clients: @database.contect(@database.clients)
    local: @detabase.context(@database.local)
    - App\Model\HomeModel(@clients, @local)

Případně něco na ten způsob. Nebo by musel poradit někdo jinej…

echo
Člen | 134
+
0
-
@database.clients.context
mara11
Člen | 42
+
0
-

super, díky! :-)

saimons
Člen | 293
+
0
-

Nebylo by lepsi si vytvorit na kazde pripojeni servicu abych pak pro kazdy model nemusel urcovat co v ni chci za DB a potom bych si jen v kazdem modelu injectnul servicu s konkretnim pripojenim DB? Melo by to jit napsat nejak takto, ale asi by to melo jit preposat kopletne do Neonu (https://forum.nette.org/…m-do-dvou-db)