Nextras\ORM – ORM nad Nextras\Dbal

hrach
Člen | 1838
+
+1
-

@pavelmlejnek

musis si to nejak upravit:

  • nad modelem definujes repository jak jsou
  • je treba upravit resolvovani classy mapperu. Bud ty mappery rucne natriskas do konfigu s vlastnimi tridami, nebo si podedis a upravis extension.
  • jmena entit se generuji v repository, tj. doporucuji nejaky baseRepository, a tam pretizit statickou metodu getEntityClassNames
pavelmlejnek
Člen | 16
+
0
-

@hrach

Tušil jsem že to jinak nepůjde, ale radši jsem se zeptal :)

Nedalo by se nastavení těch cest do namespace zabudovat do containeru, aby se to dalo nastavit v config.neon?

něco jako

orm:
	repositories:
		users:
			mapper: App\FrontendModule\Model\Orm\Mappers\UsersMapper
			entities:
				- App\FrontendModule\Model\Orm\Entities\UserEntity

popřípadě nějaké obecné nastavení cest v Namespace

orm:
	mapper:
		mapping: App\FrontendModule\Model\Orm\Mappers\*Mapper

Nezkoumal jsem to celé nijak do hloubky, takže nevím jestli je to možné, je to jen takový nápad ;)

Díky!

hrach
Člen | 1838
+
0
-

@pavelmlejnek diky za tip, popremyslim. rad bych, aby se presenteru nezvetsovaly dependency (jako ze bere argument classname svych entit), coz by toto asi nejak vyzadovalo.

Matey
Člen | 142
+
0
-

ahoj, mám v ORM nejakú možnosť vylepšiť niečo takéto? ( je to vôbec potrebné? :) poraďte prosím )

HomeRepository
/**
 * @param array $array id => ord
 */
public function position($array) {
	foreach ($array as $id => $ord) {
		$entity = $this->getById($id);
		$entity->ord = $ord;
		$this->persist($entity);
	}
	$this->flush();
}

zoraďujem takto položky z db, napr tabuľka home(id, name, ord), ak mám 5 záznamov tak toto vypluje 5× SELECT 5× UPDATE, šlo by to pohodlne zlúčiť? alebo sa takým niečim nemám zaoberať? :) ďakujem

hrach
Člen | 1838
+
0
-

@Matey

doporucuji logiku presunout z repository do service.

public function position($array)
{
	$all = $this->orm->products->findById(array_keys($array));
	foreach ($all as $entity) {
		$entity->ord = $array[$entity->id];
		$this->orm->products->persist($entity);
	}
	$this->orm->flush();
}
Peter Láng
Člen | 3
+
0
-

Můžu nějak pěkně nadefinovat entitu User, která bude vracet (mimojiné) kolekci User-ů? Například pro friend – friend vztahy.

V doctrine by to bylo takhle – http://doctrine-orm.readthedocs.org/…mapping.html#…

Editoval Peter Láng (6. 10. 2014 16:20)

hrach
Člen | 1838
+
0
-

@PeterLáng zalezi jak mas db, pokud klasicky (spojovaci tabulka (user1, user2)), tak nadefinuj m:n vztah na sebe, s tim, ze budes mit dve property.

elektricman
Člen | 29
+
0
-

Mám asi další bug :( (a nebo to jen blbě používám)

Mám skupinu (group) a v ní nějaký účastníky (particpant), kteří jsou buď zrušení nebo ne..
Ve skupině 184 mám dva účastníky. Na začátku jsou oba ve stavu canceled ⇒ false.

Dál viz zdroják:

/** @var Group $group */
      $group = $this->groups->getById(184);

      dump($group->participants->get()->findBy(['canceled'=>false])->fetchAll()); // Vypíše správně oba
      dump($group->participants->get()->findBy(['canceled'=>true])->fetchAll()); // Vypíše správně prázdný výsledek

      $participant = $this->participants->getById(1519);
      $participant->canceled = true; // změnim jednoho z těch učastníků na canceled = true
      $this->participants->persistAndFlush($participant);

      dump($group->participants->get()->findBy(['canceled'=>false])->fetchAll()); // Vypíše špatně (zase jsou tam oba)
      dump($group->participants->get()->findBy(['canceled'=>true])->fetchAll()); // Vypíše špatně (zase je prázdný výsledek)

Když dám f5 (nový request) už je to všechno správně..

Editoval elektricman (7. 10. 2014 18:29)

hrach
Člen | 1838
+
0
-

@elektricman aj, to jsem netusil, ze to ma takove dalekosahle dusledky, je to toto issue: https://github.com/…rm/issues/27

elektricman
Člen | 29
+
0
-

Ajo …
No já na to přišel až při ajaxu..

v actionDetail načtu skupinu, v handleCanceled měním canceled u účastníka a volám redrawControl, a v renderDetail pak předávám šabloně – do snippetu … S klasickým přesměrováním na this v handle to frí jak má. při Ajaxu a posílání snippetu nee :(

vitkutny
Člen | 73
+
0
-

Mám entitu page ktereá má vazbu na menu a chtěl bych vyfiltrovat stránky podle nějakých sloupečků v entitě menu.
Do pageRepository findBy předávám následující pole, ale nefunguje rekurzivně

array (1)
	menu => array (2)
		hidden => "1"
		uid => "abc" (3)

Dostávám dotaz

"SELECT DISTINCT `page`.* FROM `page` WHERE (`page`.`menu_id` IN ((`hidden` = '1') AND (`uid` = 'abc')))"

Chci vyfiltrovan stránky které mají vazbu na menu které má hidden = 1 a uid = abc
Jak na to? Děkuji.

Peter Láng
Člen | 3
+
0
-

hrach napsal(a):

@PeterLáng zalezi jak mas db, pokud klasicky (spojovaci tabulka (user1, user2)), tak nadefinuj m:n vztah na sebe, s tim, ze budes mit dve property.

A nemusím ještě někde něco namapovat? Protože výchozí chování vede k tomu, že v DbStorageReflection.findManyHasManyPrimaryColumns se nikdy nenastaví $targetId, protože $targetTable se vždycky rovná users (protože oba sloupce vedou na users, tzn. vždycky $table === $sourceTable).

hrach
Člen | 1838
+
0
-

@elektricman tvuj usecase ti jeste dnes opravim :-)

hrach
Člen | 1838
+
0
-

@elektricman prosim vyzkousej. :-)

@vitkutny

findBy(['this->menu->hidden' => 1, 'this->menu->uid' => 'abc'])
hrach
Člen | 1838
+
+1
-

@PeterLáng asi to opravdu nebude tak jednoduché, vyzkouším, opravím, ale nejdřív až v neděli … díky

vitkutny
Člen | 73
+
0
-

@hrach opět mi to nefunguje do hloubky (přímo na entitě page funguje), špatně rozezná název tabulky, dostávám následující chybu:

PDOException #42S02

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'webedit.menu_id' doesn't exist

relace v Page\Entity:

@property Menu\Entity $menu {1:1d Menu\Repository $page primary}
array (1)
"this->menu->parent" => "1"
Matey
Člen | 142
+
0
-

@hrach prosím ťa, je v poriadku že pri neúspešnom inserte do db dôjde k zvýšeniu primárneho kľúča(s auto_increment)?

s transakciami som nikdy nerobil okrem Nextrax/ORM takže možno táram

v prípade že je všetko v poriadku dôjde ku COMMITU
v prípade že nastane problém nedôjde ku ROLLBACKU

napríklad pri takomto forme, keď zadávam rovnaký slug a slug je v db nastavený na UNIQUE

protected function createComponentAddCategoryForm() {
	$form = new Form;

	$form->addText('name', 'Názov kategórie:')
		->setRequired();
	$form->addSubmit('submit');

	$form->onSuccess[] = $this->processAddCategoryForm;
	return $form;
}

public function processAddCategoryForm($form, $values) {
	$category = new GalleryCategory;
	$category->gallery = $this->gallery;
	$category->name = $values->name;
	$category->slug = \Nette\Utils\Strings::webalize($values->name);
	$category->ord = $this->gallery->galleryCategory->count();
	try {
		$this->orm->galleryCategory->persistAndFlush($category);
		$this->flashMessage('Kategória bola pridaná.', 'success');
		$this->redirect('this');
	} catch (\PDOException $e) {
		if ($e->getCode() == 23000) {
			$form->addError('Zadaný názov už existuje. Zadaj prosím iný názov.');
		}
	}
}
hrach
Člen | 1838
+
0
-

Jaj, to je normální.

Matey
Člen | 142
+
0
-

@hrach mám formulár na pridávanie fotiek do galérie, pre $image->ord potrebujem zistiť počet fotiek v galerii, čiže nastaviť poradie fotky, no správa sa to nejak divne

//action
$this->gallery = $this->orm->gallery->getBySlug($slug);

//spracovanie formu
$image = new GalleryImage;
$image->ord = $this->gallery->images->count();
// dostanem Value for App\Model\GalleryImage::$ord property is invalid.


$image->ord = 1; // 1
// ak zadám číslo, všetko je v poriadku


$image->ord = 1; // 1
$image->ord = $this->gallery->images->count(); // 13
// ak zadám číslo a následne prepíšem tak je to v poriadku, ale prečo? netuším


barDump($this->gallery->images->count()); // 13
$image->ord = 1; // 1
// ak dumpnem pred priradením zas dostanem Value for App\Model\GalleryImage::$ord property is invalid. ..wtf? :)


$image->ord = 1; // 1
barDump($this->gallery->images->count()); // 13
// ak dumpnem po priradení všetko je vporiadku

orm mám najnovšie
cache pravidelne mazane

netuším prečo dostávam tento error, keďže hodnota z $this->gallery->images->count() je číslo

edit: poriešil som to takto na priamo

$image->ord = $this->orm->galleryImage->findBy(['category' => $values->category])->count();

Editoval Matey (7. 11. 2014 23:42)

hrach
Člen | 1838
+
0
-

@Matey je to proto, ze count() metoda fetchne vsechny zaznamy do pameti. Pouzij countStored().

Jinak pro vysvetleni i ostatnim: ono image je zrejme jiz spojeny s gallery image. Tim padem je v jeho kolekci. Kolekce bude mit predpokladam nastaveno vychozi razeni, tzn. metoda count() zpusobi to, ze se orm zasnazi vracit tuto kolekci serazenou podle ord a selze, protoze image nema natavene poradi.

prebijak
Člen | 21
+
0
-

Mám formulář umožňující úpravu informací o týmu a jeho členech (počet členů je dynamický).

$team = $this->teams->getById($id);

$team->name = $form['name']->value;

// foreach ($team->persons as $person) {
// 	$this->persons->remove($person);
// }
// $this->persons->flush();

$this->teams->persistAndFlush($team);

$members = [];
foreach ($form['persons']->values as $member) {
	$firstname = $member['firstname'];

	$person = new App\Model\Person;

	$person->firstname = $member['firstname'];
	$person->lastname = $member['lastname'];

	$person->team = $team;

	$members[] = $person;
}

$team->persons = $members;
$this->teams->persistAndFlush($team);

Při úpravě ale obdržím chybu, protože orm se snaží vynullovat team_id u stávajících osob. Pokud nejprve odstraním stávající členy odkomentováním části kódu výše, insert se stejně snaží vložit team_id=null.

Editoval prebijak (8. 11. 2014 15:47)

lupo112
Člen | 11
+
0
-

Ahoj, mám 2 drobné problémy na ktoré som narazil:

  1. Potreboval by som entitu zloziť z 2 tabuliek. Do druhej tabuľky sa ukladajú dáta vytvorené pomocou triggeru prvej tabuľky. To znamená že k tabulke1 potrebujem prijoinovať tabulku2, ale pokiaľ sa bude niečo ukladať, všetko pôjde len do tabulky1.
  2. Keďže dáta z tabuky2 sú dosť dynamické a po uložení jednej položky v tabulke1 sa môžu zmeniť všetky položky tabulky2, potrebujem nejak vypnúť identity mapu u tejto entity. Neplánuješ implementovať nejaký mechanizmus na definovanie typu identity mapy, respektíve aspoň jej premazanie?

Díky za odpoveď.

hrach
Člen | 1838
+
0
-

@prebijak vypada to, ze se to chova spravne. ORM se snazi entity udrzet v konzistentnim stavu. Pokud tedy person osoby jiz v tymu nemaji byt, je treba je bud smazat rucne, nebo rucne preradit do jineho tymu. Jinak volani $team->persons = $members; je zbytecne, entity jsou uz projeny z $person->team = $team;.

@lupo112 ono by to nejak nahackovat slo, zrejme by slo i to zlepsit api, aby to slo dobre nahackovat, ale otazka je, jestli to ma smysl. Neni jednodussi si si udelat mezi temi tabulkami vazby a napri. v tem 1. si udelat virtualni gettery? Vyresilo by se tak vcelku dobre ukladani.

Ohledne refreshe identity mapy – neco takoveho je v planu, ale zatim to neni uplne priorita. Zatim nejsem rozhodnutej jak. PRomazani by mohlo zpusobit dost zavazny problemy, takze jsem spis pro refresh dat v tech entitach. Na druhou stranu, u dlouho bezicich skriptu (react) by se nejaky garbage collector hodil…

prebijak
Člen | 21
+
0
-

@hrach tak jsem to zjednodušil, ale stále stejná chyba. Pokud už tým předtím nějaké členy měl, skončí to chybou SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'team_id' cannot be null. Na druhý pokus už jsou odstraněni, takže se vloží v pořádku.

$team = $this->teams->getById($id);

$team->name = $form['name']->value;

foreach ($team->persons as $person) {
	$this->persons->remove($person);
}

$this->persons->flush();
$this->teams->persistAndFlush($team);

foreach ($form['persons']->values as $member) {
	$person = new App\Model\Person;

	$person->firstname = $member['firstname'];
	$person->lastname = $member['lastname'];

	$person->team = $team;

	$this->persons->persist($person);
}

$this->persons->flush();
hrach
Člen | 1838
+
0
-

Tyjo, divny. Mas posledni verzi? Kdyztak mi posli mailem ladenku.

prebijak
Člen | 21
+
0
-

@hrach ano, mám poslední verzi. Poslal jsem ti výstup laděnky na adresu, kterou máš na svém webu – na nette fóru ji máš označenou jako soukromou.

Hanz25
Člen | 38
+
0
-

Ahoj, nefunguje mi více podmínek pro řazení. Nejsem si jist, zda to používám správně, ale podle toho, co jsem viděl ve zdrojáku, tak by to mělo být ok. Požadavek na repozitář

$this->findBy(['this->user->active' => 1])
     ->orderBy(["webgroup" => ICollection::ASC, "this->user->age" => ICollection::ASC])->fetchAll();

vygeneruje dotaz do dtb

SELECT DISTINCT `web_userinfo`.*
FROM `web_userinfo`
LEFT JOIN `users` AS `user_id` ON `web_userinfo`.`user_id` = `user_id`.`id`
WHERE (.`user_id`.`active` = 1)
ORDER BY .`user_id`.`age`

ten druhý order, který chci, tam prostě nechce…

Jinak NextrasORM je super věc. Ovšem, čím déle to používám, tím více mi chybí pokročilejší možnosti dotazů, například OR,<,>,!= apod.

Bylo by super, mít možnost si, v případě potřeby, dopsat do krásného API svoje vlastní WHERE nebo ORDER… ale možná toho chci přespříliš :)

hrach
Člen | 1838
+
0
-

Díky moc za feedback!

  • order: https://github.com/…rm/issues/22, docasnym resenim jedine proxy do mapperu.
  • podminky pro „<,>,!=“ fungují → findBy(['active!=' => 1]), etc. OR ne a asi ani neplanuju.
  • nad zlepsenim api pro rozsiritelnost se jeste zamyslim! Diky :-)
Hanz25
Člen | 38
+
0
-

Tak na to order jsem přišel. Ty tam podporu pro multiple order máš, ty funkce orderBy jsou na array připraveny, proto mi to moc nešlo do hlavy.

CollectionMapper.php line 72

	public function orderBy($column, $direction = ICollection::ASC)
	{
		$this->release();
		$column = $this->getParser()->parse($column, NULL, $this->builder);
		/* --> */$this->builder->setOrder([], []);
		$this->builder->addOrder($column . ($direction === ICollection::DESC ? ' DESC' : ''));
		return $this;
	}

Možná hloupý dotaz, protože neznám všechny souvislosti a použití orderBy, ovšem jestli jsem to dobře pochopil, tak při přidávání podmínky, mažeš všechny předchozí. Když to zakomentuju, můžu se někde jinde potkat s chybou?

hrach
Člen | 1838
+
0
-

@Hanz25 naimplementovano: https://github.com/…rm/issues/22

prebijak
Člen | 21
+
0
-

Je možné aby count fungoval nějak šetrněji? Už při středně velké tabulce (~ 100 000 položek) si následující kód ukrojí přes 200 MB paměti.

		$allMessages = $this->messages->findAll()->orderBy(['timestamp' => 'DESC']);
		dump($allMessages->count());
		$this->template->messages = $allMessages->limitBy(50);

Problémem je hlavně první vygenerovaný dotaz, jehož výsledek mě vůbec nezajímá, stačil by select count(*).

SELECT `message`.*
FROM `message`
ORDER BY `message`.`timestamp` DESC

SELECT `message`.*
FROM `message`
ORDER BY `message`.`timestamp` DESC
LIMIT 50

Jedu na nejnovější verzi nextras/orm dev-master b40cde0

Jan Tvrdík
Nette guru | 2595
+
0
-

Zkus místo count() volat countStored().

hrach
Člen | 1838
+
0
-

Nad timto byla velka diskuze. Honza Tvrdik byl zastance toho, ze by se dana metoda mela tez prejmenovat, aby to bylo zrejme. Nakonec jsem ji ponechal, protoze countable interface zrovna ma tento nazev metody a

count($allMessages);

by se melo chovat stejne, jako kdyby to bylo pole, tzn. ty polozky tam musim byt.

prebijak
Člen | 21
+
0
-

Jan Tvrdík napsal(a):

Zkus místo count() volat countStored().

Jo funguje, díky.

@hrach přidáš pak na nextras.cz apigen, není-li už někde jinde.

Hanz25
Člen | 38
+
0
-

Daly by se nějak zjišťovat data z vazební tabulky pro m:n vztahy? Když bych si chtěl ukládat doplňující info k vazbě…

Řeším teď systém soukromých zpráv, kdy jedna zpráva může mít více příjemců, což je v pohodě uživatelé:zprávy ⇒ m:n, ovšem chci vědět, zda každý z uživatelů zprávu přečetl.

Nechci mít další SQL dotaz a novou tabulku, když ta vazební je na tento problém jak dělaná. Taktéž by to šlo dvěma 1:n vazbami, ale to se mi zdá nepraktické.

Editoval Hanz25 (15. 1. 2015 18:11)

hrach
Člen | 1838
+
0
-

@Hanz25 zatim to resim presne jak pises – entitou navic. Nevim, jak to resit pekne jinak, pokud bys mel nejaky napad, muzes zkusit otevrit issue s navrhem :-)

Matey
Člen | 142
+
0
-

zdravím, @hrach prosím ťa čo je nové v orm a nie je to ešte v testoch/tvojom orm-demo?

mám composer

"require": {
	"nextras/nette-framework": "~2.2.0",
    "nette/database": "~2.3@dev",
    "nextras/orm": "@dev"
}

spravil som zmeny podľa fixes for the latest ORM

a všetko bolo v poriadku až kým som dnes nedal composer update.., nepomôže mi ani keď sa vrátim na „nextras/orm“: „1.0.0-beta5“ a vrátim zmeny

dostávam:
Service ‚orm.mappers.gallery‘: Service of type Nette\Database\Context needed by Nextras\Orm\Mapper\Nette\NetteMapper::__construct() not found. Did you register it in configuration file?

Nette\Database\Context je predsa defaultne zaregistrovaná služba nie?

hrach
Člen | 1838
+
0
-

@Matey no nevim kde je presne problem, zkus si Context injectnout treba do presenteru, jestli ti to funguje. Ocovidne je tam neco spatne nastavene (u tebe v configu), ze to tu sluzbu nezna…

Matey
Člen | 142
+
0
-

@hrach tak som to skúsil s čistým nette-sandboxom

composer:

"nextras/nette-framework": "~2.2.0",
"nextras/orm": "@dev",
"nette/database": "~2.3@dev"

config:

php:
	date.timezone: Europe/Prague


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

	session:
		expiration: 14 days

	database:
		dsn: 'mysql:%dbhost%;dbname=%dbname%'
		user: %dbuser%
		password: %dbpass%
		options:
			lazy: yes


services:
	- App\Model\UserManager
	router: App\RouterFactory::createRouter

dostanem:
Nette\DI\ServiceCreationException

Service ‚18_App_Model_UserManager‘: Service of type Nette\Database\Context needed by App\Model\UserManager::__construct() not found. Did you register it in configuration file?

skúsil som rôzne kombinácie.. a problém je asi v „nette/database“: "~2.3@dev", podla githubu boli nejaké zmeny v nette/database – master, nvm či to mohli spôsobiť tie..

bez nej mi ten sandbox nabehne (teda s nette/database v2.2.3)

nejaká rada ako znovu rozbehnúť projekt? ďakujem

edit1: ešte dodám, že ten projekt mám 2x – dev a production, production beží normalne keďže som tam nedal update

edit2:

"require": {
		"nette/nette": "@dev",
		"nextras/orm": "@dev",
	},
	"minimum-stability": "dev"

a všetko je vporiadku.. takže niekde tam dochádza ku chybe – zjavne pre pripravovane nete 2.3

Editoval Matey (25. 1. 2015 12:11)

hrach
Člen | 1838
+
0
-

@Matey je to slozitejsi, nez jsem myslel:

  • pozmenena database extension nove nebere konfiguraci pod nette klicem, je treba ji presunout pod database (tj. vyjmout z nette klice, dat o uroven vis).
  • bohuzel, nova extension vyzaduje nette/di 2.3
  • a to bohuzel vyzadaju skoro vsechny ostatni veci z 2.3.

Tak resenum se je bud locknout na commit (pro ted asi nejjednodussi vec). A ja pohnu s vyvojem nextras/dbal, abych mohl nahradit nette database.

Matey
Člen | 142
+
0
-

@hrach dik že si sa na to pozrel.. nj, došlo mi keď som začal pozerať čo je nove v nette master vetve.. j tú konfiguráciu som presunul vyššie aby sa mi to rozbehlo, tých pár dní do vydania nette 2.3 už vydržím aj s dev :)

edit: tak teda DEPENDENCIES!!! lock with the latest reasonable nette/database commit

Editoval Matey (26. 1. 2015 11:02)

Hanz25
Člen | 38
+
0
-

Ahoj,
byla by nějaká možnost řadit pomocí field?
Jak řešíš překlady?

Dá se nějaká podmínka nastavit přímo pro všechny dotazy na repozitář, nebo collection pro danou entitu? Myslím tím, že bych si nastavil něco jako $comments->findBy([„allowed“ ⇒ 1]) a už bych na to nemusel myslet a při jakémkoliv získání komentářů, bych dostal jen ty povolené. Protože jinak to musím psát úplně všude. V jediné výjimce (administrace) by se zobrazovaly i nepovolené komentáře.

hrach
Člen | 1838
+
0
-

@Matey sorry, ten commit byla chyba, zitra odstranim. Ten lock ma byt jen pro dev depencencies, aby se to dobre buildovalo, lock na konkretni commit/spravna konfigurace ndb bude pak tvoje zodpovednost.

@Hanz25

  • field – jedine v mapper vrstve
  • preklady – neresim, respektive bych resil uplne stejne jako vsechno jine, co tabulka, to patricne entity. pokud nejaka entita ma preklady v jine entite, muzes nadefinovat gettery, ktery jsou treba zavisly na nejaky sluzbe, ktera ti rekne, co je current jazyk.
  • ano i ne – findAll() nad mapperem by mela vracet cely „vesmir“, takze pokdu bys chtel dostat i neschvalene komentare, tak by to nefungovalo. Obecne doporucuji postup, ktery jsem prezentoval na posledni sobote a je i v orm demu. Tj. mit dve property a iterovat nad tou, kterou chces. Podle pojmenovani pak muzes urcit i to, ktera je vychozi – tj. comments a commentsAll, vs. comments a commentsAllowed.
Hanz25
Člen | 38
+
0
-

@hrach
Jasně, díky za odpověď.

Matey
Člen | 142
+
0
-

@hrach nazdar, odkedy používam nette/*vymenované všetky balíčky* @dev a nextras/orm @dev tak mám problém s injectovaním základného Modelu do presenteru cez anotáciu @inject

pri @inject anotácii:

<?php
use App\Model\Orm;

/** @var Orm @inject */
public $orm;
?>

dostávam:
Service of type App\Model\Orm used in @var annotation at Property [ <default> public $orm ] not found. Did you register it in configuration file?

v prípade inject metody je to vporiadku

<?php
use App\Model\Orm;

/** @var Orm */
public $orm;

public function injectOrm(Orm $orm)
{
	$this->orm = $orm;
}
?>

je to vporiadku

pri injectovaní iných služieb cez anotaciu @inject je všetko vporadku

používam:

"require": {
		"php": ">= 5.3.7",
		"nette/application": ">=2.3.0",
		"nette/bootstrap": ">=2.3.0",
		"nette/caching": ">=2.3.0",
		"nette/component-model": ">=2.3.0",
		"nette/database": ">=2.3.0",
		"nette/deprecated": ">=2.3.0",
		"nette/di": ">=2.3.0",
		"nette/finder": ">=2.3.0",
		"nette/forms": ">=2.3.0",
		"nette/http": ">=2.3.0",
		"nette/mail": ">=2.3.0",
		"nette/neon": ">=2.3.0",
		"nette/php-generator": ">=2.3.0",
		"nette/reflection": ">=2.3.0",
		"nette/robot-loader": ">=2.3.0",
		"nette/safe-stream": ">=2.3.0",
		"nette/security": ">=2.3.0",
		"nette/tokenizer": ">=2.3.0",
		"nette/utils": ">=2.3.0",
		"latte/latte": ">=2.3.0",
		"tracy/tracy": ">=2.3.0",
		"nextras/migrations": "2.3.1",
		"nextras/orm": "@dev"
	},
	"minimum-stability": "dev"
hrach
Člen | 1838
+
0
-

@Matey chyba v nette, ale asi to orpavim no. https://github.com/…emo/issues/1#…

stenly
Člen | 6
+
0
-

@hrach
Neco dělám pořád špatně jak tohle přemapuju na entitu nad buildrem jsem žádný fetch nenašel.
Zkoušel jsem věci jako $this->getRepository()->hydrateEntity($builder); Ale to nemůže fungovat když je tam queryBuilder misto dat. Díky za radu

class CoreSiteMapper extends Mapper
{

    public function detectSite($scriptPath)
	{
		$builder = $this->builder();
        $builder->andWhere('path = SUBSTR(?, 1,  LENGTH(`path`))', $scriptPath);
        return $builder;
	}
}
hrach
Člen | 1838
+
0
-
  • silne doporucuji pouzivat naming, tj. get pro entity, find pak pro kolekci.
  • toto by korektne vratilo kolekci. je prece hovadina volat hydrate nad builderem nebo kolekci
  • pokud tahas jenom jeden zaznam, nema vyznam pouzivat builder, ten slouzi zejmena po praci v kolekcich.
  • tzn. spravne je cca toto (pokud tedy chces getDetectedSite()):
public function getDetectedSite($scriptPath)
{
	$row = $this->connection->query('
		SELECT * FROM %table
		WHERE [path] = SUBSTR(%s, 1,  LENGTH([path]))
	', $this->getTableName(), $scriptPath)->fetch();

	if (!$row) return NULL;
	return $this->getRepository()->hydrateEntity($row->toArray());
}

Nicmene mi prijde zbytecne na to psat vlastni metodu, kdyz se to da pekne „udelat“ v php, idelane v nejake servisni tride:

class SiteDetector
{
	/** @var CoreSiteRepository @inject */
	public $repository;
	public function detectSite($scriptPath)
	{
		return $this->repository->getBy(['path' => substr($scriptPath, 1)]);
	}
}
wassy
Člen | 46
+
0
-

Snažím se zprovoznit ORM, ale pořád nemůžu přijít na to, co dělám špatně když mi tracy píše: Unknown or incorrect time zone: ‚Europe/Prague‘ ,

Nejsem moc zběhlý v sql a ani nevím jestli to může být tím, mohl by mi někdo poradit kde může být problém?

Pro jistotu přidávám výtah z configu:

php:
	date.timezone: Europe/Prague

extensions:
        dbal: Nextras\Dbal\Bridges\NetteDI\DbalExtension
        orm: Nextras\Orm\Bridges\NetteDI\OrmExtension

orm:
	model: Orm\Orm
dbal:
	driver: mysql
	host: 127.0.0.1
	database: name
	username: root
	password:

díky za jakoukoli radu :-)

hrach
Člen | 1838
+
+2
-

@wassy tak jsem k tomu napsal drobnou docku: http://nextras.cz/…ysql-support