Nextras\ORM – ORM nad Nextras\Dbal

hrach
Člen | 1834
+
+11
-

Nextras Orm

$author = new Author();
$author->name = 'Jon Snow';
$author->born = 'yesterday';
$author->mail = 'snow@wall.st';

$publisher = new Publisher();
$publisher->name = '7K publisher';

$book = new Book();
$book->title = 'My Life on The Wall';
$book->author = $author;
$book->publisher = $publisher;

$orm->books->persistAndFlush($book);

Editoval hrach (4. 12. 2015 0:21)

hrach
Člen | 1834
+
0
-

@Zax
Máš tu někde svůj thread pro Nextras\ORM? Právě jsem zkouknul tvoji přednášku a líbí se mi to, mám v plánu si s tím brzo začít hrát, tak jenom abych věděl, kam můžu ty své dojmy směřovat ;-)
V té přednášce 20:05 jak tam taháš ty komentáře, k čemu slouží ten ->get()? Nestačilo by prostě $this->allComments->findBy(…)? Je to drobnost, ale už se vidím, jak na to budu zapomínat a zrovna v této situaci IDE ani nenapovídá.

To je proto, ze $this->allComments je instance OneHasMany, ktera ma dale metody jako add, set, atp. Metoda get() vraci kolekci, se kterou normalne pracujes pri vsech vyberech. Akorat je tato kolekce uzpusobena pro praci nad danou relaci.

Pokud bych anotaci navrchu tridy spravne napsal jako

/**
 * @property OneHasMany|Comment[] $allComments {1:n CommentsRepository}
 */

tak uz mi to v PhpStormu bude napovidat spravne jak pri prochazeni foreachem, tak pri tomto volani.

Zax
Člen | 370
+
0
-

Konečně jsem si našel čas na zkoušení, nicméně se mi nějak nedaří rozjet nové Nette\Database. Composer používám velmi krátce, možná je chyba mezi židlí a klávesnicí..

EDIT: ano, chyba byla přesně tam :-) Příspěvek jsem upravil, aby tolik nestrašil.

Editoval Zax (29. 6. 2014 7:38)

Zax
Člen | 370
+
0
-

Jen dvě drobnosti:

Když si víckrát podědím DIModel

  • Zax\Model\Orm extends DIModel
    • Web\Model\Orm extends Zax\Model\Orm

a pak používám Web\Model\Orm, tak se mi nenačítají anotace v Zax\Model\Orm. Nevím zda je to intended.

Pokud není nadefinovaný žádný repozitář v DIModelu, tak to háže notice ;-)

EDIT: Ještě třetí drobnost:

Chtěl bych používat prefixy. Zkusil jsem toto:

namespace Zax\Model;
use Nextras\Orm\Mapper\Mapper as BaseMapper;

class Mapper extends BaseMapper{
    public function getTableName() {
        return 'zax_' . parent::getTableName();
    }
}

ale nenačítají se mi vazby (bez prefixů a tohoto kódu se načítají v poho). Cizí klíče mám nastavené správně (ve smyslu že směřují kam mají), ale hádám, že je třeba ještě něco změnit v mapperu. No, jdu si dál hrát, třeba na to přijdu :)

EDIT: Tak jsem právě spustil composer update a prefixy už fungují :-) Děkuju!

Editoval Zax (11. 7. 2014 21:39)

hrach
Člen | 1834
+
0
-

@Zax

  • tu chybu s getTableName() jsem opravil „omylem“, pac jsem to taky nejak potreboval a nefungovalo to :D
  • notice by tam jiz byt nemela
  • to parsovani do hloubky u DIModelu, kdyztak posli pull, zatim sem to nepotreboval a mam tunu jinych veci na programovani do orm :D

díky! :)

elektricman
Člen | 29
+
0
-

Ahoj :)

Mám dotaz.
Chtěl bych například mít v entitě properity address, která reprezentuje objekt Address (ten ale není entitou)
jen se skládá ze tří sloupečků v DB (address_street, address_city, address_postcode).

Jen bych potřeboval nějak napsat setter a getter pro tu properity address.
Doufám že sem to napsal srozumitelně :)

Jde to nějak?

Napdá mě bud přímo v entitě napsat setter a getter s tím že budu mít přístup k těm sloupčkům normálně z mapperu. A nebo to nějak nacpat do mapperu.

Edit: Když si udelám virtuální properity se setterem a getterem na ten Objekt Address, tak se mi ho to snaží persistovat do databáze :(

Editoval elektricman (10. 8. 2014 10:57)

hrach
Člen | 1834
+
0
-

@elektricman a ten Address ma byt i writeable? toto opravdu nefunguje?

/**
 * @property-read Address $address {virtual}
 * @property string $addressStreet
 * @property string $addressCity
 * @property string $addressPostCode
 **/
class MyEntity extends Nextras\Orm\Entity\Entity
{
	public function getAddress()
	{
		return new Address($this);
	}
}
Jan Suchánek
Člen | 404
+
+1
-

@hrach Máš někde ukázku využití mapperu?

hrach
Člen | 1834
+
+2
-

@jenicek ukazka nikde neni, prakticky se do nej pisou metody na select dat, ktery nejde dostat standardnim rozhranim a jsou tedy mapper-specific.

/**
 * @method ICollection|Author[] findBySomeMagic()
 */
class AuthorsRepository extends Repository {}

class AuthorsMapper extends Mapper
{
	public function findBySomeMagic()
	{
		return $this->databaseContext->fetchAll('your sql query');
	}
}
hrach
Člen | 1834
+
+2
-

diky anotaci nad repository se volani proxyuje na mapper, a vysledek vraceny mapperem je hydratovan do entit a zabalen do ArrayCollection.

Jan Suchánek
Člen | 404
+
0
-

@hrach takze rel a related se pisou jen do entit?

hrach
Člen | 1834
+
+1
-

@jenicek zadne rel a related se v nextras/orm nepouzivaj :)

Jan Suchánek
Člen | 404
+
0
-

@hrach Ok, jasně a půjde vytvořit pomocí Nextras\Orm entita, která zjistí své předky a potomky nebo to se musí dělat odděleně? Nebo je to k ničemu?

/**
 * @property-read int $id
 * @property-read int $parent_id
 * @property-read int $sort
 * @property ManyHasMany|Category[] $ancestors {m:n CategoriesRepository} // tady přesně netuším jak
 * @property ManyHasMany|Category[] $descendants {m:n CategoriesRepository} // tady přesně netuším jak
 * @property OnToMany|Locale[] $locales {1:n LocalesRepository}
 */
final class Category extends Entity
{
}

a když bych chtěl k Category získat i její třeba překlad pomocí další entity Locale?

Může entita ověřovat i délku ukládaného řetězce?
* @property string $name // varchar 40?

Editoval jenicek (12. 8. 2014 17:02)

hrach
Člen | 1834
+
+1
-

@jenicek

  • prvni task je slozitejsi. Spravne by to melo vypadat takto:
/**
 * @property int $sort
 * @property Category|NULL $parent {m:1 CategoriesRepository $children}
 * @property OneHasMany|Category[] $children {1:n CategoriesRepository $parent}
 */
final class Category extends Entity
{
}
  • poznamky
    • id neni nutne, jiz je v predkovi
    • parent je prima vazba na parenta, pristupuj k tomu jako k entite, ne k id.
    • volitelne pak nejake virtualni gettery na protunelovani do hloubky, nicmene, nebude to efektivni, protoze pro kazdou uroven zanoreni bude jeden dotaz.
  • Locale entity: mas to v podstate spravne (preklep), volitelne si muzes napsat neco takovehoto:
/**
 * @property OneHasMany|Locale[] $locales {1:n LocalesRepository}
 * @property-read string $name {virtual}
 */
final class Category extends Entity
{
	private $localeService;

	public function injectLocaleService(LocaleService $localeService)
	{
		$this->localeService = $localeService;
	}

	public function getName()
	{
		$translation = $this->locales
			->get()
			->findBy(['lang' => $this->localeService->getLang()])
			->fetch();

		return $translation->translation;
	}
}
  • validace: nic takoveho neni implementovano, udelej si idealne setter s validaci.
Jan Suchánek
Člen | 404
+
0
-

@hrach Prozkoumám díky. Čučel jsem na tvoje nový ORMko a přemýšlel jsem zda půjde to samé lépe než v YetORM (pěkněji, přehledněji a pečlivěji?).

Tady jsou položené dotazy v SQL co mi ta prasárna zatím generuje.

Je to výpis „omezeného stromku“ s jazykovými překlady včetně toho, že má i nějaký výchozí lang.

InjectService vypadá zajímavě.

add validate: OK jasný, ale asik by se hodila taky, ale nejspíš to do Entit nepatří.

No holt vyzkouším uvidím.

Zatím mi vyhovoval YetORM, ale píšu vše zatím hulvátsky to vím :).

elektricman
Člen | 29
+
+1
-

@hrach moje chyba :( Funguje to jak má. Jen já tam měl špatný závorky u toho {virtual}.
Omlouvám se za mistifikaci :)

Editoval elektricman (14. 8. 2014 19:46)

hrach
Člen | 1834
+
+2
-

Beta 1 vydana :) Pokud mi pomuzete ji otestovat, budu moc vdecny :)

Darkling
Člen | 35
+
+1
-

Ahoj, je k dispozici někde dokumentace, popřípadě nějaký ukázkový projekt. O demu na youtube vím.

elektricman
Člen | 29
+
+1
-

Zdravím.

Chtěl sem se zeptat, jesli v nové verzi korektně fungují asociace hasOne, pro NULL hodnoty.

Když mám například entitu

/**
 * @property Workgroup|NULL $workgroup {m:1 WorkgroupsRepository}
 * ...
**/
class User extends Entity { .. }

Mě to pořád při $entity->toArray(IEntity::TO_ARRAY_RELATIONSHIP_AS_ID) (ale i jinde) vyhazuje vyjímku:

PDOException #42S22

SQLSTATE[42S22]: Column not found: 1054 Unknown column '0' in 'where clause' search►
SQL

SELECT `workgroups`.*
FROM `workgroups`
WHERE (`id` IN ((`0` IS NULL)))

prostě se to snaží hledat v tomto případě workgroup s ID = NULL, přitom by to mělo vrátit prostě NULL, že není, protože v db je uložebo workgroup_id = NULL.

Chtěl sem napsat nějakej failující test, ale jaksi mi failujou uplně všechny od nextras/orm kvuli nějaky sessně, tak se mě to nechtělo řešit :o)
Jen sem se chtěl zeptat jestli vám to dělá taky?

hrach
Člen | 1834
+
0
-

@elektricman neni to tim, ze nemas v DB ten sloupec NULLable, (tj. je nastaven na NOT NULL) a proto ti db tam automaticky insertuje nulu?

vitkutny
Člen | 73
+
0
-

@hrach mam stejný problém, projevuje se po smazání metody getParent v entitě:
https://github.com/…u/Entity.php

sloupec parent v db je nullable

hrach
Člen | 1834
+
0
-

@elektricman @vitkutny diky moc, fixed! https://github.com/…db3a5ff3b6ea divny je, ze jsem na to nenarazil? A neprijde mi, ze by to byla regrese :-)

elektricman
Člen | 29
+
0
-

@hrach Díky za supr rychlou opravu :)
Pro jednu entitu už to šlape jak hodinky,.. ale pokud tahám celej list (přes findAll), tak problém přetrvává :(

PDOException #42S22

SQLSTATE[42S22]: Column not found: 1054 Unknown column '0' in 'where clause' search►
SQL

SELECT `workgroups`.*
FROM `workgroups`
WHERE (`id` IN ((`0` IS NULL) AND (`1` = 3) AND (`2` = 5) AND (`3` = 3) AND (`4` = 1) AND (`5` = 2)
AND (`6` = 2) AND (`7` = 2) AND (`8` = 2) AND (`9` = 2) AND (`10` = 3) AND (`11` = 2) AND (`12` = 2)
AND (`13` = 2) AND (`14` = 4) AND (`15` = 4) AND (`16` = 2) AND (`17` = 6) AND (`18` = 2) AND (`19`
IS NULL) AND (`20` IS NULL) AND (`21` IS NULL) AND (`22` = 4) AND (`23` IS NULL) AND (`24` = 2) AND
(`25` = 5) AND (`26` IS NULL) AND (`27` IS NULL) AND (`28` IS NULL) AND (`29` IS NULL) AND (`30` IS
NULL) AND (`31` IS NULL) AND (`32` IS NULL) AND (`33` IS NULL) AND (`34` IS NULL) AND (`35` IS NULL)
AND (`36` = 2) AND (`37` IS NULL) AND (`38` IS NULL) AND (`39` IS NULL) AND (`40` IS NULL) AND (`41`
IS NULL) AND (`42` IS NULL) AND (`43` IS NULL) AND (`44` IS NULL) AND (`45` = 1) AND (`46` IS NULL)
AND (`47` IS NULL) AND (`48` = 2) AND (`49` = 2) AND (`50` IS NULL) AND (`51` IS NULL) AND (`52` =
3) AND (`53` = 5) AND (`54` = 5) AND (`55` IS NULL) AND (`56` = 10) AND (`57` IS NULL) AND (`58` IS
NULL) AND (`59` IS NULL) AND (`60` = 5) AND (`61` = 5) AND (`62` = 2) AND (`63` = 9) AND (`64` = 1)
AND (`65` = 4) AND (`66` IS NULL) AND (`67` IS NULL) AND (`68` = 10) AND (`69` = 5) AND (`70` = 2)
AND (`71` = 3) AND (`72` IS NULL) AND (`73` IS NULL) AND (`74` IS NULL) AND (`75` IS NULL) AND (`76`
= 10) AND (`77` IS NULL) AND (`78` IS NULL) AND (`79` IS NULL) AND (`80` IS NULL) AND (`81` IS NULL)
AND (`82` IS NULL) AND (`83` IS NULL) AND (`84` = 2) AND (`85` = 2) AND (`86` IS NULL) AND (`87` =
10) AND (`88` = 3) AND (`89` IS NULL) AND (`90` IS NULL) AND (`91` IS NULL)))

Edit: Ale ted koukám že to nefunguje jen když první položka toho listu, má NULL hodnotu v DB .. pokud to mají další vpořadí, tak to nevadí … =/

Editoval elektricman (16. 9. 2014 9:06)

hrach
Člen | 1834
+
+3
-

@elektricman dalo mi to zabrat… je to bug v orm, ale diky tomu jsem objevil i bug v nettedatabase

doporucuji update tedy obou :-)

elektricman
Člen | 29
+
0
-

@hrach Špica! Díky moc! :)

hrach
Člen | 1834
+
0
-

@elektricman @vitkutny mohl bych vas poporosit o nejaky feedback, respektive napady, myslenky, zhodnoceni, zklamani, etc. z orm? :) klidne issue cesky na github :-) diky

vitkutny
Člen | 73
+
0
-

@hrach chtěl bych se jen zeptat jestli je už možné/bude možné dělat jednosměrně definované entity? mám třeba entity menu a page.. a u page chci vazbu na menu, ale menu by na ní nemělo být závislé… jestli o tom menu entity potřebuje vědět tak aspoň jestli jde někde přetížit v repository nějaká metoda abych tam nějak mohl tu definici dostat? jinak orm super jedno z mála které se dá použít s mým pofidérním používáním namespace :)

hrach
Člen | 1834
+
0
-

@vitkutny zatim me to moc nenapadlo, ale prijde mi to jako relevantni pozadavek, takze https://github.com/…rm/issues/29

elektricman
Člen | 29
+
0
-

Jestli muzu jeste pripominkovat:)), tak když v mapperu použiju metodu typu

class AuthorsMapper extends Mapper
{

	/**
	* return array|IRow[]
	*/
    public function findBySomeMagic()
    {
		$selection = $this->databaseContext
					->table($this->getTableName())
					->where(...)
					->where(...);

		return $selection->fetchAll();

    }
}

Tak mi to vzhodí exception, že položky nemají primární klíč, protože ActiveRow jen přetipovanej na (array) nevrátí data řádku jako pole, ale nativně přetypovanej objekt do pole..

A nenapadl mě jinej způsob, jak využít Nette Selection\Database\Selection v Mapperu..
Jde to nějak?

Editoval elektricman (20. 9. 2014 20:53)

hrach
Člen | 1834
+
+1
-

@elektricman pokud vracis pole, jsou data obalena do arrayCollection, coz neni uplne nejefektivnjesi, pokud s tim chces jeste dal pracovat (dost casto nechces), takze proto selection neni podporovana a zatim se pouziva SqlBuilder, nad kterym se da jeste pracovat, tj. pouzij

$builder = $this->builder();
$builder->addWhere();
return $builder;

a melo by to fungovat :-)

elektricman
Člen | 29
+
0
-

Zdá se mi to, nebo se nevolají akce onBeforePersist a onAfterPersist (ani onXxxxUpdate..) na Entitě ?
Ani v kodu nikde nemužu najít že by se na ně někde volal fireEvent.

v onPersist se mi totiž nedaří změnit a persistoat nějaká její data. (to je logicky, protože bych tam musel zavolat $this->getRepository()->persistAndFlush($this); a z toho to vypadne protože entita je v isPersisting[]..)

Nic řeším ptákoviny: Stejně to spíš patří do Repozitáře, do přetížené persist metody… :)

Editoval elektricman (24. 9. 2014 13:07)

Jan Tvrdík
Nette guru | 2595
+
0
-

Zrovna události hrach včera předělával, takže otázka v jakém je to teď přesně stavu.

hrach
Člen | 1834
+
0
-

@elektricman ano, do vcerejska tyto metody na entite nebyly volany. Od commitu ktery zminuje @JanTvrdík volany jsou, podle dane operace zvaz taky presunuti do on* eventu na presenteru.

vitkutny
Člen | 73
+
0
-

je nějak možné se z entity nebo repozitáře dostat přes public metody k údajům databáze jako jestli je sloupec text varchar jakou má délku a podobně? zkouším udělat automaticky generované formuláře a teď mám info jen že se jedná o string, kdybych měl ty údaje můžu rozhodnout jestli použít addText addTextarea a případně rovnou aplikovat validační pravidla. Díky

hrach
Člen | 1834
+
0
-

V dicu mas Nette database structure.

Matey
Člen | 142
+
0
-

@hrach nazdar, prosím ťa, nedopátral som sa ako by som v repository metode getBy() dosiahol OR miesto AND.

konkrétne hľadám zhodu užívateľa podľa mena alebo emailu

$this->getBy(['username' => $username, 'email' => $email]);

btw nedávno som niekde čítal že začínaš s dokumentáciou, bude sprístupnená postupne alebo až ako kompletný celok?

hrach
Člen | 1834
+
0
-

@Matey

  • toto nejde udelat nad repository, idealne si to naproxyuj do mapperu. (pridas anotaci metody nad repository, a naimplementujes metodu v mapperu, ktery data vytahne a vrati: $this->repository->hydrateEntity($this->databaseContext->fetch('SELECT *...');
  • dokumentace bude postupne, ale hlavne jeste nemam na ni dodelany system, respektive mam uz novy web, ale jeste musim doprogramovat skript, ktery bude checkoutovat repozitare a vytahovat z nich jednotlive verze pro ruzne nextras balicky.
Matey
Člen | 142
+
0
-

@hrach
mám to takto

/**
 * @method Users getTest($username, $email)
 */
class UsersRepository extends Repository {}



class UsersMapper extends Mapper {

	public function getTest($username, $email) {
		$data = $this->databaseContext->fetch('SELECT * FROM users WHERE username = ? OR email = ?', $username, $email);
		return $this->repository->hydrateEntity([$data]);
	}
}

ale dostávam: Data returned from storage does not contain primary value(s) for ‚id‘ key.
Keď si dumpnem $data tak je tam všetko v poriadku, čiže aj id. Čomu nechápem? :)

hrach
Člen | 1834
+
0
-

Podivej se, mas dve moznosti, bud vratis Entitu, (coz je pri get* metode zadouci):

$data = $this->databaseContext->query('SELECT * FROM users WHERE username = ? OR email = ?', $username, $email)->fetch();
return $this->repository->hydrateEntity($data);

nebo vratis data pro kolekce. tak ti staci vratit ResultSet.

return $this->databaseContext->query('SELECT * FROM users WHERE username = ? OR email = ?', $username, $email);
Matey
Člen | 142
+
0
-

takže potrebujem vrátiť Entitu alebo nič v prípade neúspešného hľadania

to čo si mi poradil neprejde, pretože hydrateEntity() vyžaduje array()

s týmto sa niekam dostanem, ale len ak sa v db niečo nájde(teda by som ešte potreboval dalšiu podmienku ak sa nič nenašlo vrátiť NULL).. no to je trošku wtf aby som musel robiť niečo takéto pre jednoduchý dotaz :(

public function getTest($username, $email) {
		$data = $this->databaseContext->query('SELECT * FROM users WHERE username = ? OR email = ?', $username, $email)->fetch();

		$array = [];
		foreach ($data as $key => $value) {
			$array[$key] = $value;
		}

		barDump($array, 'data');
		return $this->repository->hydrateEntity($array);
	}

trošku to rozoberiem, čo kedy dostávam..

$data = $this->databaseContext->query('SELECT * FROM users WHERE username = ? OR email = ?', $username, $email);
//Nette\Database\ResultSet

$data = $this->databaseContext->query('SELECT * FROM users WHERE username = ? OR email = ?', $username, $email)->fetch();
//Nette\Database\Row

foreach ($data.....)
//array() a teda to už hydrateEntity() zožere

Editoval Matey (28. 9. 2014 10:36)

hrach
Člen | 1834
+
0
-

pardon.

$data = $this->databaseContext->query('SELECT * FROM users WHERE username = ? OR email = ?', $username, $email)->fetch();
return $this->repository->hydrateEntity((array) $data);
Matey
Člen | 142
+
0
-

@hrach už je mi trápne pýtať sa, no ale čo narobím, keď skúšam a k ničomu nedospejem

tak je to správne, v podstate to isté ako keď som to prehodil cez foreach.. dik
no žiaľ tým sa rieši len časť keď sa niečo nájde, akonáhle sa hľadá neexistujúci záznam, zas to kričí
Data returned from storage does not contain primary value(s) for ‚id‘ key.

Čo podstrčiť do hydrateEntity() aby som v app dostával FALSE? tak ako je tomu ak použijem napr. getById() na neexistujúce id.

skúsil som jednoducho

public function getTest($username, $email) {
		$data = $this->databaseContext->query('SELECT * FROM users WHERE username = ? OR email = ?', $username, $email)->fetch();
		if (!$data) return FALSE; // pripadne NULL
		return $this->repository->hydrateEntity((array) $data);
	}

no dostávam NetteMapper could convert only array|SqlBuilder|ResultSet argument, recieved „boolean“.

zároveň pripájam ešte jednu otázku :)
mám tabuľku contact_us, na to entitu ContactUs, repo ContactUsRepository, mapper ContactUsMapper a v Orm zaregistrované ContactUsRepository.. dostávam chybu Class App\Model\ContactU does not exist

‚s‘ z ContactUs sa nejak stráca.. ak z toho spravím ContactUssREpository, ContactUssMapper a zaregistrujem ContactUssRepository tak to prejde.. ale data žiadne nezískam, lebo sa to snaží ťahať z contact_uss, začínam sa chytať za hlavu :D (a ty zo mňa už určite tiež) ako to riešiť? prípadne nejde o nejaky bug?

Editoval Matey (28. 9. 2014 22:13)

hrach
Člen | 1834
+
0
-
  • s tim vracenim null|false je to bug. jdu to opravit., edit: bez fixu by to slo tak, ze si tu proxy napises do repository rucne…
  • nazvy repository a mapperu jsou podstatna jmena v mnoznem cisle, kdyz tam das neco takovehoto, tak se to chova takto divne. Resenim muze byt treba nekde v bootstrapu, nebo pred vytvorenim db uprava inflekce
Inflect\Inflect::$uncountable['contactus'] = TRUE; // schvalne malym

snad by to melo fungovat.

vitkutny
Člen | 73
+
0
-

@hrach nevím jestli mám chybu někde v definici nebo se jedná o bug, mám v entitě

* @property Menu\Entity|NULL $parent {m:1 Menu\Repository $children}
* @property Menu\Entity[] $children {1:m Menu\Repository $parent}

a při přiřazení parent dostávám chybu:

Nextras\Orm\Relationships\ManyHasOne->	updateRelationship
Call to undefined method Nextras\Orm\Entity\Collection\Collection::add().

případně remove() pokud již v entitě je parent nastavený z db

Jan Tvrdík
Nette guru | 2595
+
+1
-

@vitkutny Instance čeho je v $children? Teď to vypadá, že je tam z nějakého důvodu Collection, přitom by tam měla být instance OneHasMany. Inicializuješ to property nějak ručně?

Tohle mi např. bez problémů projde:

/** @var MenuRepository $repo */
$repo = $this->orm->menu;

$a = new Menu();
$aa = new Menu();
$ab = new Menu();

$repo->attach($a);

$aa->parent = $a;
Assert::count(1, $a->children);
$a->children->add($ab);
Assert::count(2, $a->children);
Matey
Člen | 142
+
0
-

@hrach

Inflect\Inflect::$uncountable['contactus'] = TRUE;

toto nepomohlo, dal som to hneď za autoloader v bootstrape.

vyriešil som to prepísaním tejto metody v ContactUsRepository

public static function getEntityClassNames() {
	$class = substr(get_called_class(), 0, -10);
	return [$class];
}

je vôbec potrebné aby metóda getEntityClassNames vracala Inflect::singularize($class)?

Editoval Matey (29. 9. 2014 14:41)

vitkutny
Člen | 73
+
0
-

@JanTvrdík máš pradu, děkuji. Způsobovala to tato metoda v entitě:

public function getChildren()
{
    return $this->getValue('children')->get()->findBy(['hidden' => NULL]);
}

můžu se zeptat jak jinak ji zapsat? mohl bych stávající přejmenovat na allChildren a tuhle dát jako virtual, je ještě jiný způsob? v annotation parseru je filteredrelationship, jestli to slouží k tomuto účelu případně jak to použít?

Edit:
btw chtěl jsem si dát mínus na svou otázku kterou jsem si měl důkladněji prověřit, ale nejde to :(

Editoval vitkutny (29. 9. 2014 15:15)

hrach
Člen | 1834
+
0
-

@Matey hmhm, fungovat by to melo. https://github.com/…/Inflect.php#… mel si smazanou cache? kazdopadne, kdyz uz jsi to vyresil… :-) to je urcite taky korektni reseni. Tim, ze to mas pretizeny dokonce jen v tom kokretnim presenteru, muzes to delat „staticky“, tj. vracet rovnou „ContactUs“ s namespace.

@vitkutny vzdy musi existovat property s plnou vazbou. filteredrelationship neni zatim moc otestovane a moc vyhod oproti virtual metode nepridava – zatim. ve verzi 2 bude, ale do te doby bych to bral jako experimental.

pavelmlejnek
Člen | 16
+
0
-

Snažím se naroubovat Orm na mojí vlastní namespace strukturu, nicméně narážím na problém s pevně nastavenými cestami.

Představuji si zhruba něco takového:

  • App\FrontendModule\Model\Orm\Repositories\UsersRepository
  • App\FrontendModule\Model\Orm\Mappers\UsersMapper
  • App\FrontendModule\Model\Orm\Entities\UserEntity

Existuje nějaká možnost jak tohoto chování dosáhnout? Po zběžném prohlédnutí zdrojáků jsem se pokoušel ručně registrovat jednotlivé třídy přes config.neon v sekci orm, ale to se mi nepovedlo.

Díky za odpověď :)