Doctrine 2 ORM & Migrations extension a sandbox pro Nette 2.0.x

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

„useSimleAnnotation“ – asi překlep, ne? (simple)

Patrik Votoček
Člen | 2221
+
0
-

grongor napsal(a):

„useSimleAnnotation“ – asi překlep, ne? (simple)

pošli pull https://github.com/…octrine.texy

darthcz
Člen | 113
+
0
-

Zdravím,

především chci poděkovat za super doplněk. Nicméně jsem narazil na pár problémů, které bych chtěl s vámi prokonzultovat.

Když chci migrovat pouze entity v několika složkách, tak bohužel nemůžu.

Pokud zadám do configu

entityDirs:	%appDir%/models/entities

tak mi to prohledává pouze entity z dané složky, což je dobře. Pokud ale použiji pole:

entityDirs:
	- %appDir%/models/entities

tak už to bohužel načítá celou adresářovou strukturu pravděpodobně od appDir.

Napadá mě, že by to mohlo být způsobeno, pokud parametry pole, zadané v configu, připojuješ do pole ke svému defaultnímu entityDirs. Pokud ale ne, tak nevím :-/

Dále bych chtěl poprosit, zda by šlo implementovat http://wildlyinaccurate.com/…um-requested. Pokud mám totiž v databázi někde enum, tak nemám šanci migrovat. S řešením na dané stránce to funguje. Rád bych nabídl pull, ale vůbec nevím, kam to dát do tvého doplňku. Fungovalo mi to, pokud jsem to dal přímo do \Doctrine\DBAL\Migrations\Tools\Console\Command\DiffCommand.php. Nicméně toto řešení se mi nelíbí, jelikož si tu knihovnu v další verzi přepíšu.

Problém jsem původně řešil zde na foru: https://forum.nette.org/…e-migrations#…. Vlastní anotace jsem ignorovat nechtěl a ani jsem nechtěl, aby mi doctrine prohledávalo i presentery. Pustil jsem se tedy do tohoto zkoumání a došel jsem sem.

Děkuji za případné rady.

darthcz
Člen | 113
+
0
-

První problém s cestami k entitám je skutečně způsoben spojováním polí, tudíž default je zahrnut k cestám.

Konfigurace se načítá v souboru libs/nella/doctrine/Nella/Doctrine/Config/Extension.php ve funkci loadConfiguration na řádce 87.

$config = $this->getConfig($this->defaults);

Toto vyvolá kód v souboru libs/nette/nette/Nette/Config/CompilerExtension.php ve funkci getConfig na řádku 56:

$config = Helpers::merge($config, $defaults);

Řešení vidím asi jen v přetížení této funkce bez spojování polí. Pokud je parametr z default zároveň v configu, tak by měl být použit ten z configu. Parametry s totožným klíčem by se neměly spojit. Hodilo by se asi něco jako array_diff_assoc.

Řešení, které funguje, jelikož zde odpadá spojování polí, mění $defaults:

'entityDirs' => array('%appDir%'),

za

'entityDirs' => '%appDir%',

Toto řešení nicméně neřeší problém obecně. Pokud budeme chtít použít defaultně dvě cesty, tak bude potřeba použít opět pole a opět vyvstane problém se spojováním polí.

Editoval darthcz (26. 1. 2013 0:36)

frosty22
Člen | 373
+
0
-

Též mám nyní tuto chybu, problém je, že tato třída chybí. Sic stáhl jsem si ji z https://github.com/nella/framework ale následně to vyžaduje další chybějící třídy, načež tedy nemám moc teď morálku doplnit, resp. s composerem ještě nemám takové zkušenosti, takže ani jako přidání závislosti přímo na nella/framework se nezdařio .(

Trošku pešek nella asi proběhla refaktorizací a to se zapomnělo dodat do sandboxu, a u kdyby postrádám funkční sandbox :( Ach dna dny snahy a procházení těchto nástaveb na propojení doctrine2 a nette, a nakonec by bylo nejjednodušší asi si to udělat sám :)

Editoval frosty22 (30. 1. 2013 1:33)

Patrik Votoček
Člen | 2221
+
0
-

darthcz napsal(a):

… tak už to bohužel načítá celou adresářovou strukturu pravděpodobně od appDir.

musíš použít vykřičník:

entityDirs!:
    - %appDir%/models/entities

Dále bych chtěl poprosit, zda by šlo implementovat http://wildlyinaccurate.com/…um-requested.

Momentálně ne (cílem je s co nejmenším množstvím kódu naroubovat Doctrine do Nette) možná někdy časem se k tomu dostanu.

Patrik Votoček
Člen | 2221
+
0
-

Co se týká cest k souborům pokud vám to nefunguje tak pusťte composer update případně smažte složku libs a spusťte composer install

PS: nezapomínejte na composer self-update :-)

EdWood
Člen | 16
+
0
-

Stáhl jsem si poslední verzi z githubu a při spuštění mi vyskočí chyba: „Class ‚Nella\Console\Config\Extension‘ not found“. S Nette začínám, díky.

ViPEr*CZ*
Člen | 813
+
0
-

Chci se optat… nevíte jak vyhledám IS NOT NULL. Hledám na google, ale nic jsem k tomu nenašel.

Když udělám toto:
->getRepository(„\Model\Entity\ContactEntity“)->findBy(…);

Tak tam můžu použít kritéria… array(„userID“ ⇒ NULL) mi to vyhodí do where userID IS NULL, ale jak zprovoznit IS NOT NULL? Díky.

stefi023
Člen | 71
+
0
-

ViPErCZ napsal(a):

Chci se optat… nevíte jak vyhledám IS NOT NULL. Hledám na google, ale nic jsem k tomu nenašel.

Nejsem si jist zda kriteria ve findBy mohou byt negativni :) jeste jsem to nikdy nepotreboval… jinak to resim pres vlastni query :)

Editoval stefi023 (28. 3. 2013 17:17)

ViPEr*CZ*
Člen | 813
+
0
-

stefi023 napsal(a):

ViPErCZ napsal(a):

Chci se optat… nevíte jak vyhledám IS NOT NULL. Hledám na google, ale nic jsem k tomu nenašel.

Nejsem si jist zda kriteria ve findBy mohou byt negativni :) jeste jsem to nikdy nepotreboval… jinak to resim pres vlastni query :)

To je škoda… to je docela opruz. Mohu jen návod jak si napsat vlastní query, abych naplnil entitu a výsledkem bylo pole s danými entitami?
Uff už to mám… no hledá se to dost špatně, ale podařilo se.
Nic méně psát tu šílenost jsem se s NDB odnaučil. Ještě, že když pak volám execut, tak to vrací pole s entitama a ne čisté pole nebo nějakou obecnou třídu Row. Díky za info. ;-)

Editoval ViPEr*CZ* (28. 3. 2013 18:04)

stefi023
Člen | 71
+
0
-

ViPErCZ napsal(a):

nevim jestli uplne rozumim, ale asi bych na to sel pres vlastni repository

Entite reknes o custom repository

/**
 * @Entity(repositoryClass="MyModelRepository")
 */
class MyModel {
	// obsah modelu
}

V repository dodefinujes metodu

class MyModelRepository {

	public function findByHavingUser() {
		return $this->createQueryBuilder('u')
				->where('u.userID IS NOT NULL')
				->getQuery()
				->getResult()
				;
	}

}

a pak uz jen volas

$modelsWithoutUser = $em->getRepository('MyModel')->findByHavingUser();

Editoval stefi023 (28. 3. 2013 23:20)

stefi023
Člen | 71
+
0
-

ViPErCZ napsal(a):

Jak si to tedy vyresil? nejak pres ty kriteria a findBy? Jde to?

ViPEr*CZ*
Člen | 813
+
0
-

Jj nějak podobně to mám. Jen jsem ještě volal execute namísto getResult(). Díky.

ViPEr*CZ*
Člen | 813
+
0
-

stefi023 napsal(a):

ViPErCZ napsal(a):

Jak si to tedy vyresil? nejak pres ty kriteria a findBy? Jde to?

Ne ne nejde. Koukal jsem do zdrojáku Doctrine a dává to tam buď „= ?“ nebo IS NULL nebo IN (?)
Tyto tři operátory se dají jen protlačit přes metodu findBy.

Elfoslav
Člen | 15
+
0
-

Tak po vytvorení projektu:

composer create-project vrtak-cz/nette-doctrine-sandbox yourNewProject

, zmazania zložky libs a spustenia composer install zmizol Fatal Error:

Class 'Nella\Console\Config\Extension' not found

A objavila sa pekná Nette homepage :)

composer update nefungoval

Patrik Votoček
Člen | 2221
+
0
-

píšu si do TODO tento týden na to kouknu :-)

klingac
Člen | 3
+
0
-

Elfoslav napsal(a):

Tak po vytvorení projektu:

Class 'Nella\Console\Config\Extension' not found

pridaj si do bootstrap riadky:

\Nella\Console\Config\Extension::register($configurator);
\Nella\Doctrine\Config\Extension::register($configurator);
\Nella\Doctrine\Config\MigrationsExtension::register($configurator);

az po zavolani

$configurator->createRobotLoader()
doublemcz
Člen | 15
+
0
-

Ahoj,

máte tušení jak pustit migrace? Nahrál jsem do složky migrations test migraci. Bohužel se to nespustilo. Dle configu a zaregistrované extenstion by se to pustit mělo né? :-)

use Doctrine\DBAL\Migrations\AbstractMigration;
use Doctrine\DBAL\Schema\Schema;

class Version20130704103600 extends AbstractMigration
{
    public function up(Schema $schema)
    {
        $table = $schema->createTable('test_tabulka');
        $table->addColumn('id', 'integer', array('unsigned' => true));
        $table->addColumn('title', 'string', array('length' => 128));
        $table->setPrimaryKey(array('id'));
    }

    public function down(Schema $schema)
    {
        $schema->dropTable('test_tabulka');
    }
}
rohlizde
Člen | 4
+
0
-

Ahoj,

potřeboval bych se dostat do config.neon pro nastavení doctrine. Zkoušel jsem to v presenteru přes:

<?php
            $conf = Environment::getConfig('doctrine');
?>

ale to tahá jenom z common: parameters:. Přikládám config.neon soubor.

<?php
	#
# 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
#
common:
	parameters:
		database:
			driver: pdo_pgsql
			host: localhost
			dbname:
			user:
			password:
			charset: utf8
			collation: utf8_czech_ci


	php:
		date.timezone: Europe/Prague
		session.save_path: "%tempDir%/sessions"
		# zlib.output_compression: yes

	nette:
		session:
			autoStart: smart

	doctrine:
		connection: %database%
		entityDirs: %appDir%
		proxyDir = %appDir%
		proxyNamespace = 'SomeWeb\Proxies'
		console: true

	migrations:
		connection: @doctrine.connection

	services:
		database: @doctrine.entityManager

		authenticator: Authenticator( @database::getRepository('User') )


	factories:


production < common:


development < common:
	parameters:
		database:
			dbname: doctrine2
			user:
			password:
?>
Patrik Votoček
Člen | 2221
+
0
-

@rohlizde: a k čemu konkrétně se potřebuješ dostat?

Mesiah
Člen | 240
+
0
-

Patrik Votoček napsal(a):

Co se týká cest k souborům pokud vám to nefunguje tak pusťte composer update případně smažte složku libs a spusťte composer install

PS: nezapomínejte na composer self-update :-)

Co mi prosím uniká? :/

[RuntimeException]
Failed to clone https://github.com/nella/doctrine.git, git was not found, check that it is installed and in your PATH env.

sh: git: not found

Editoval Mesiah (17. 8. 2013 0:08)

jiri.pudil
Nette Blogger | 1028
+
0
-

Ta hláška je IMO dostatečně výmluvná. Nemáš nainstalovaný Git, který Composer používá ke stahování závislostí.

klingac
Člen | 3
+
0
-

doublemcz napsal(a):

Ahoj,

máte tušení jak pustit migrace? Nahrál jsem do složky migrations test migraci. Bohužel se to nespustilo. Dle configu a zaregistrované extenstion by se to pustit mělo né? :-)

ak to mas spravne nakonfigurovane a nainstalovane tak ich spustis

php www/index.php migrations:migrate

inak doporucujem prestudovat vypis z

php www/index.php
Mesiah
Člen | 240
+
0
-

Zdravím,
po delší době jsem chtěl provést update repositories a taky bylo potřeba provést update composeru.
Jenže, od té doby mám problém se stažením repositories a i vytvořením nového projektu…
Projekt vytvářím klasicky: composer create-project vrtak-cz/nette-doctrine-sandbox XYZ
Přejdu do XYZ a spustím composer update vše projde, až na nella/doctrine dev-master (008135e ⇒ 392e4fa) u které dostávám hlášku:

[RuntimeException]
The .git directory is missing from /var/www/XYZ/libs/nella/doctrine/Nella/Doctrine, see http://getcomposer.org/commit-deps for more information

Můžete mi prosím poradit, kde je problém – co udělat abych to rozběhl? O gitu/composeru v podstatě nic nevím, potřebuji to pouze jako nástroj na získání sandboxu.

doublemcz
Člen | 15
+
0
-

Ahoj,

víte někdo něco o Nella/Console a Nella/Doctrine pod Nette 2.1 přes composer? Tohle padne na závislostech, očividně to není vydaný. Nedá se to nějak očůrat?

"require": {
		"php": ">= 5.4.0",
		"nette/nette": "2.1.*",
		"nella/doctrine": "dev-master",
		"nella/console": "dev-master",
}
David Matějka
Moderator | 6445
+
0
-

radeji pouzij kdyby doctrine a console.

v composeru muzes dat verzi nejakej alias:

"nette/nette": "2.1.* as 2.0.99"
Jiří Nápravník
Člen | 710
+
0
-

Patrik sám někde psal, že je lepší použít Doctrine že Nella\Doctrine dále vyvíjet nebude…