Doctrine 2 ORM & Migrations extension a sandbox pro Nette 2.0.x
- Patrik Votoček
- Člen | 2221
grongor napsal(a):
„useSimleAnnotation“ – asi překlep, ne? (simple)
pošli pull https://github.com/…octrine.texy
- darthcz
- Člen | 113
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
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
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
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
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
:-)
- ViPEr*CZ*
- Člen | 817
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
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 | 817
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
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)
- Elfoslav
- Člen | 15
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
- klingac
- Člen | 3
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
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
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:
?>
- Mesiah
- Člen | 240
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ťtecomposer 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 | 1029
Ta hláška je IMO dostatečně výmluvná. Nemáš nainstalovaný Git, který Composer používá ke stahování závislostí.
- klingac
- Člen | 3
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
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
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
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
Patrik sám někde psal, že je lepší použít Doctrine že Nella\Doctrine dále vyvíjet nebude…