Nextras\ORM – ORM nad Nextras\Dbal

hrach
Člen | 1834
+
0
-

@goood no na action tu kaskadu nemej, ne? vzdy ji mej jen v tom smeru, ve kterem ji potrebujes.

goood
Člen | 26
+
0
-

hrach napsal(a):

@goood no na action tu kaskadu nemej, ne? vzdy ji mej jen v tom smeru, ve kterem ji potrebujes.

Ježiš no jo…Díky, příště si to raději 2× prověřím než sem něco napíšu :)

hrach
Člen | 1834
+
+1
-

@goood & @Vastlik opraven bug, kdy nebylo mozne smazat enetity bez cascady, ikdyz v non-nullable relationship zadne propojene entity nemela. https://github.com/…a12ed09b7b40

goood
Člen | 26
+
+1
-

hrach napsal(a):

@goood & @Vastlik opraven bug, kdy nebylo mozne smazat enetity bez cascady, ikdyz v non-nullable relationship zadne propojene entity nemela. https://github.com/…a12ed09b7b40

Tak jsem aktualizoval na tuto verzi a muzu potvrdit ze funguje tak jak ma. Diky moc!

Vastlik
Člen | 58
+
0
-

hrach napsal(a):

@goood & @Vastlik opraven bug, kdy nebylo mozne smazat enetity bez cascady, ikdyz v non-nullable relationship zadne propojene entity nemela. https://github.com/…a12ed09b7b40

Nakonec vůbec nemažu akorát zaznamenávám změnu. Ale jinak díky za tvoji (a Honzi Tvrdíka) práci! Je to fakt super!

hrach
Člen | 1834
+
0
-

Nakonec vůbec nemažu akorát zaznamenávám změnu

tak ted nevim, jestli je to report chyby, nebo spokojenost s danym chovanim :-) ale asi spokojenost, kdybys chtel cascadu, tak ji prave musis definovat :)

namoR
Člen | 2
+
+1
-

Hoj, malá drobnost class PersistanceHelper fce addRelationtionToQueue asi malý překlep ;)

PS: dííííky za orm – zatím super!

Editoval namoR (16. 2. 2016 15:18)

Vastlik
Člen | 58
+
0
-

hrach napsal(a):

Nakonec vůbec nemažu akorát zaznamenávám změnu

tak ted nevim, jestli je to report chyby, nebo spokojenost s danym chovanim :-) ale asi spokojenost, kdybys chtel cascadu, tak ji prave musis definovat :)

@hrach ne, veliká spokojenost :) Ale změnil jsem z myšlenky, když to chce uživatel smazat, prostě to smažu z DB na myšlenku, akorát tomu změním stav. :)

Editoval Vastlik (16. 2. 2016 16:16)

hrach
Člen | 1834
+
+1
-

@namoR diky, opraveno :)

namoR
Člen | 2
+
0
-

@hrach nenašel jsem možnost definovat si název vazební tabulky (m:n), zatím se to řídí paternem –

manyHasManyStorageNamePattern = "%s_x_%s";

Řeším to přetížením funkce getManyHasManyStorageName, která vrací můj název tabulky. Pokud budu mít tabulky … facebook_campaign_round a facebook_campaign_round_type tak vazební tabulka bude strašně dlouhá (ikdyž na prní pohled všeříkající). Nešlo by řešit třeba přidáním TableName
do anotace a neuvedení by bralo v potaz pattern ? ;)

Editoval namoR (18. 2. 2016 13:17)

hrach
Člen | 1834
+
+1
-

@namoR delas to spravne, staci pretizit tu metodu. Kvuli tomu tam je :-) cca timto zpusobem :) https://github.com/…esMapper.php#…

hrach
Člen | 1834
+
+1
-

Nextras ORM 2.0.0 is out!

Novinky:

  • robustni syntaxe pro zapis modifieru u entity
  • podpora kaskady! pro persist i remove
  • mrknete na BC, ale neni se treba jich bat, vetsina vas zrejme vubec neovlivni.
dms
Člen | 87
+
0
-

Zdravím, potřeboval bych vytvořit entitu s translated properitami. V databázi mám vždy 2 tabulky – jednu pro nepřekládané položky a druhou pro překládané položky (např product a product_translation). Jde mi o podobné chování jako je třeba zde

https://github.com/…nslatable.md
nebo zde
http://propelorm.org/…rs/i18n.html

Předpokládám, že už někdo musí mít toto vyřešené v NextrasORM. Potřeboval bych poradit jak na to a jestli je to možné jednoduše implementovat v NextrasORM

hrach
Člen | 1834
+
0
-

@dms plugin pro to asi zadny nebude, ale nemelo by to byt nic moc sloziteho, vse to bude ale zaviste na mire abstrakce, jakou bys chtel pouzit. To nejjednodussi je proste udelat dve entity zvlast, a v getterech na produktu sahnout do translation a vratit preklad.

SuperMartas
Člen | 13
+
+1
-

Ahoj,
na Nextras/ORM jsem chtěl přejít z NDB (ačkoliv se mi její koncept náramně líbí a rve mi to srdce, když ji musím opustit) a po vyzkoušení YetORMu, protože ORM nějakým způsobem potřebuji. Ačkoliv se mi na první pohled Nextras/ORM zalíbil (např. IRelationshipCollection::set vidím nějak slušně vyřešené poprvé), už po prvním odzkoušení mě zarazilo několik pro mě dost zásadních věcí:

  • Neúplný Debug Bar – dost mi zde schází počet vrácených řádků a EXPLAIN. Obojí jsem dost často v NDB využíval. Proč to není i zde?
  • Přenášení všech sloupců a ne jen těch potřebných (jako to umí NDB). Proč se to sem nedochovalo? S názorem, že je žádoucí mít inicializovanou celou entitu nesouhlasím. Na co mi budou data, která nikde nevyužiji?
  • „Repository API“ neumí takovou základní věc jako filtrovat podle OR (s tímhle měl problém i YetORM, ale šlo to). To kvůli tomu musím do Mapperu?
  • Ani QueryBuilder, natož „Repository API“, neumí UNION. Ten neumí ani NDB a já se ptám, jak je bez něj možné optimalizovat tento dotaz (id – PRIMARY, username – UNIQUE): id = 1 OR id = 2 OR username = ‚SuperMartas‘? Už při třech ORech z minimálně dvou sloupců (byť správně zaindexovaných) to totiž databáze nepobírá a bez použití UNIONu mi prohledává všechny řádky, namísto použití indexů.
  • Jaký je důvod použití MySQLi místo PDO? Mi to tak trochu přijde jako jít proti proudu…

Předem děkuji za objasnění.

Editoval SuperMartas (29. 2. 2016 20:42)

Vastlik
Člen | 58
+
0
-

Ahoj,
je nějaká možnost napsat tuto query v repository
`SELECT * FROM Project WHERE MONTH(DueDate) = 1 AND YEAR(DueDate) = 2010`
nebo je třeba ji napsat k mapperu?
Díky

Editoval Vastlik (29. 2. 2016 21:09)

hrach
Člen | 1834
+
+1
-

@SuperMartas diky moc za zpetnou vazbu!

Neúplný Debug Bar – dost mi zde schází počet vrácených řádků a EXPLAIN. Obojí jsem dost často v NDB využíval. Proč to není i zde?

Protoze jsem to nenaimplementoval a nebylo to pro me tolik dulezote. Vic nez Orm je to zalezitost dbalu, ale chapu – zakladam issue: https://github.com/…al/issues/35

Přenášení všech sloupců a ne jen těch potřebných (jako to umí NDB). Proč se to sem nedochovalo? S názorem, že je žádoucí mít inicializovanou celou entitu nesouhlasím. Na co mi budou data, která nikde nevyužiji?

Tato funkcionalita je sice mozna papirove moc hezka, ale v praxi velice komplikujici kod a celou jeho logiku. Dale vyzaduje bud extremni cachovani cesty pomoci debug backtrace, nebo smireni se s prunikem vsechn potrebnych sloupcu, coz ve vysledku nedava vubec zadna pouzitelna data. Pokud se dostavac do extremniho usecasu, kdyz tabulka obsahuje velka data a jejich prenos je zbytecny, doporucuji rozdelit to do dvou tabulek a entity. Bohuzel, toto je cena za Orm. Ciste teoreticky by se nekdy v budoucnu mohla objevit funkcionalita na dvojfazove nacitani entity, ale zatim opravdu low priority.

„Repository API“ neumí takovou základní věc jako filtrovat podle OR (s tímhle měl problém i YetORM, ale šlo to). To kvůli tomu musím do Mapperu?

Zatim bohuzel ano. Buto to v 2.1. Issue uz je nejakou dobu otevrena: https://github.com/…m/issues/105. Prakticky ale takovou fukcionalitu moc nepotrebuju, a kdyz uz, tak stejne by mi Repository interface nestacil.

Ani QueryBuilder, natož „Repository API“, neumí UNION. Ten neumí ani NDB a já se ptám, jak je bez něj možné optimalizovat tento dotaz (id – PRIMARY, username – UNIQUE): id = 1 OR id = 2 OR username = ‚SuperMartas‘? Už při třech ORech z minimálně dvou sloupců (byť správně zaindexovaných) to totiž databáze nepobírá a bez použití UNIONu mi prohledává všechny řádky, namísto použití indexů.

Neumi a ani umet nebude. Urcite ne Repository. A u query builder taky ne, volani metod by melo upravovat pak jakou cast query? Nedavalo by to vyznam. Pouzij union, normalne v mapperu.

Jaký je důvod použití MySQLi místo PDO? Mi to tak trochu přijde jako jít proti proudu…

Nekolik, ale jeden naprosto zasadni: PDO je zprasene. Omezuje te MySQLi nejak konkretne?

hrach
Člen | 1834
+
0
-

@Vastlik v mapperu.

SuperMartas
Člen | 13
+
+1
-

@hrach Děkuji za objasnění, jsem rád, že to pomohlo oboustranně. :)

Neúplný Debug Bar

Super. :) Jestli to nestihneš, tak mě to pravděpodobně tak naštve, že to sám implementuji a jestli se mi to bude zdát jako použitelný kód, možná zkusím i nějak přispět. Ale nic neslibuji.

Přenášení všech sloupců a ne jen těch potřebných

OK, to zní docela rozumně a asi to i chápu a dokážu s tím žít. Zatím jsem se do tak extrémní situace nedostal, tak snad to bude OK.

„Repository API“ neumí takovou základní věc jako filtrovat podle OR

Super, snad se to už do té další verze konečně dostane. :D Zatím teda nechávám na Mapperu. Asi ten můj případ bude taky ojedinělý…

Ani QueryBuilder, natož „Repository API“, neumí UNION

Spíš mě napadlo něco jako „spojování kolekcí“, že by se volalo něco jako:

<?php
$collection = new Collection();
$collection->add($this->findBy(["column" => "value"]));
$collection->add($this->findBy(["column2" => "value2"]));
$collection->fetchAll(); // získá data do obou kolekcí přes UNION, resp. to závisí na mapperu (ArrayMapper by to dělal např. přes array_merge())
?>

Ale je to jen návrh, asi by to chtělo nějak víc promyslet, ale základní idea je takováto…

Omezuje te MySQLi nejak konkretne?

Zatím ne, spíš mě to zajímalo, protože co tak pozoruji, tak všichni jedou PDO a, jak už jsem napsal, mi přijde používat MySQLi jako jít proti proudu. Ale osobně nemám nic moc proti.

PDO je zprasene

Máš k tomu nějaké zajímavé čtení nebo čerpáš přímo ze zdrojáků? Docela by mě to zajímalo. Ale asi i já už jsem narazil na lehkou zprasenost – při UniqueContraintViolationException v NDB jsem nenašel jiný způsob, jak získat alespoň jméno „porušeného“ klíče, než vyparsovat ho ze zprávy výjimky. Ale nejsem si jistý, jestli to není kvůli MySQL. Nemá na to něco lepšího MySQLi, resp. Nextras/ORM?

hrach
Člen | 1834
+
0
-

Spíš mě napadlo něco jako “spojování kolekcí”, že by se volalo něco jako:

kdybych to takto nejak potreboval, delal bych to pres ten array mapper :-)

Máš k tomu nějaké zajímavé čtení

O nějakém článku nevím, je to spíš právě zkušenost z reálné funkcionality, ať už hydratace přes fetchObject, tak nutnost dělat nějaky emulovaný prepared statements, pseudo bindy, ktery neumí např pole intů (viz. hacky v Doctrine), apod. Určitě není problém napsat driver pro PDO, imo otázka 30 minut, ale mysqli nám hází méně klacků pod nohy. Třeba pgsql extenze je výrazně starší a api tomu taky odpovídá :-) Ale pořád je to přímočařejší než přes PDO.

při UniqueContraintViolationException v NDB jsem nenašel jiný způsob, jak získat alespoň jméno “porušeného” klíče

A v PDO to jde nejak ziskat? Toto muze byt urcite dalsi feature request.

Editoval hrach (29. 2. 2016 23:45)

SuperMartas
Člen | 13
+
+1
-

A v PDO to jde nejak ziskat? Toto muze byt urcite dalsi feature request.

Napsal jsem si na to takovou malou třídu. Sice je to pro NDB, ale ta zpráva, ze které to beru, bude nejspíš pro PDO stejná. Tak pro inspiraci:

<?php
public function __construct(UniqueConstraintViolationException $exception)
{
	if ($exception->errorInfo[1] !== 1062)
		throw new InvalidArgumentException("Code is not 1062");

	if (!preg_match("~'(?P<value>.*)' for key '(?P<key>.*)'$~", $exception->getMessage(), $matches))
		throw new InvalidArgumentException("Message has an invalid format");

	$this->key = $matches["key"];
	$this->value = $matches["value"];
}
?>

Jestli chceš založit feature request, tak to udělej, já se v tom moc nevyznám…

hrach
Člen | 1834
+
0
-

@Vastlik jeste jsem si uvedomil, samozrejme tu tvoji konkretni podminku muzes rozepsat do DueDate >= 2010–01–01 00:00:00 AND DueDate < 2010–02–01 00:00:00. A to uz jde v mapperu v pohode.

SuperMartas
Člen | 13
+
+2
-

Našel jsem pár dalších nedostatků.
Mám entitu User a ta má atribut $password. Můj plán byl, že tento atribut bude při čtení vracet uložené zahashované heslo, tedy to samé, co je v databázi. Zapisovat se do něj ale bude plaintextové heslo, které se následně v setteru okamžitě zahashuje. Nenašel jsem způsob, jak toho rozumně dosáhnout, protože se při čtení volá setter, ač to zní dost podivně, ale přesto je to logické z principu fungování. Heslo je tak zahashované podruhé, což je nežádoucí.
Zkoušel jsem to obejít trochu nepohodlně přes read-only property $passwordHash, která by vracela právě ten hash hesla, který je i v databázi, a virtuální write-only property $password, jejíž setter by zapisoval zahashované heslo do $passwordHash. Ale zde nastávají další problémy:

  1. Do read-only property nelze zapisovat a to dokonce ani ve třídě, která ji vlastní!
  2. Write-only properties nejsou implementovány nebo mi z nějakého důvodu nefungují.

Docela mě zaráží, že takové podle mě základní věci nejsou na spoustě místech vyřešeny, případně se s nimi ostatní programátoři nesetkali. Možná to dělám špatně jen já, což je velmi pravděpodobné. :D
To mě přivádí na otázku: existuje (na GitHubu) nějaký volně dostupný reálný projekt, který používá Nextras/ORM, abych se mohl inspirovat? Zatím jsem našel pouze Componette, ale chtělo by to něco víc…

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

Snažit se mít nekonzistentní čtení a zápis do property (tj. jedno bere plain-text a druhé vrací hash) je imho blbost. Představa že $user->password = $user->password má nějaký side-effect je divná.

Do read-only property nelze zapisovat a to dokonce ani ve třídě, která ji vlastní

Jde, ale je to potřeba udělat explicitně.

Write-only properties nejsou implementovány nebo mi z nějakého důvodu nefungují

Místo write-only property použij normální PHP metodu nazvanou třeba setPassword().

SuperMartas
Člen | 13
+
+1
-

To nekonzistentní čtení a zápis mně osobně zase tak divné nepřijde, ale ohledně toho mám ještě spoustu dalších otázek, které by tu nebylo vhodné probírat, takže na to založím vlastní téma. Ale jinak super, díky, pomohlo.

hrach
Člen | 1834
+
0
-

@SuperMartas presne jak pise Honza! :-) Pokud chces setovat plaintext, ktery se zaencoduje, napis si uplne vlastni metodu setPassword, a vubec se nezaobirej virtualnimi properties :-)

protože se při čtení volá setter, ač to zní dost podivně

neni tak uplne pravda. setter se vola pri hydrataci, ale je odlozeny az do doby prvniho cteni ;) hrani se slovicky, ale urcite to takhle dava vetsi vyznam.

Jako ukazka snad uz jedine https://github.com/hrach/orm-demo a https://github.com/…db-benchmark, byt velmi trivialni.

Editoval hrach (2. 3. 2016 9:15)

hrach
Člen | 1834
+
0
-

@SuperMartas jo a prosim nezakladej nova vlakna :-) bud tu, nebo klidne na githubu. (tam radej spis anglicky :-))

SuperMartas
Člen | 13
+
0
-

setter se vola pri hydrataci, ale je odlozeny az do doby prvniho cteni

Jasně, myslel jsem si to a chápu, proč to tak je, jen jsem to asi špatně formuloval.

Pokud chces setovat plaintext, ktery se zaencoduje, napis si uplne vlastni metodu setPassword

Mě to jen přišlo divný psát něco jako:

<?php
$user = new User();
$user->username = "abc";
$user->setPassword("123");
$user->email = "a@b.c";
?>

To potom vybízí k otázce, proč je zrovna u hesla použita setovací metoda a všechno ostatní jsou properties. Možná by pomohlo to lépe nazvat, ale nějaký rozumný název mě nenapadá, nebo to alespoň dát do dokumentačního komentáře.

jo a prosim nezakladej nova vlakna

To, na co se chci zeptat, je úplně jiné téma, které se ORMu dotkne jen okrajově a ještě obecně ORMu, ne až tak konkrétně Nextras/ORM, takže by se to sem úplně nehodilo.

hrach
Člen | 1834
+
0
-

Ad setovani password: da se na to divat taky tak, ze hashovani hesla je proste funcionalita, kterou zabalim do servisni tridy. Respektive ji bude provadet v service RegisterNewUserService. Tak to resim ja.

Editoval hrach (2. 3. 2016 13:26)

mates
Člen | 36
+
0
-

Ahoj, zkouším db transakce a čtu dokumentaci. Jsou transakce plně implementovány i v 1.1? V dokumentaci jsem to našel jen u 2.0. Díky m.

hrach
Člen | 1834
+
0
-

@mates byt nevim co presne myslis, tak ani u orm ani u dbalu nedoslo k zadnym zmenam, takze funguje to tam uplne stejne :-)

mates
Člen | 36
+
0
-

hrach napsal(a):

@mates byt nevim co presne myslis, tak ani u orm ani u dbalu nedoslo k zadnym zmenam, takze funguje to tam uplne stejne :-)

Mám na mysli práci s metodami persist a flush;
U dokumentaci 2.0 se píše

$this->model->persist($user);
$this->model->persist($contact);
$this->model->flush();

ale v 1.1 kde to sice není dokumentováno tak funguje

$this->model->users->persist($user);
$this->model->contacts->persist($contact);
$this->model->flush();

Jelikož v 1.1. to nebylo dokumentováno a syntaxe je trochu jiná, tak abych nepoužíval něco co třeba nebylo úplně dokončeno.

Požadovanou funkčností pak je, aby se při chybě při uložení $contacts do db neuložil ani $user. Což předpokládám na základě dokumentace:

At the end of your work, you should confirm your changes by flushing them. Flushing is internally implemented as a commiting of a transaction; transactions are automatically opened with your first persistence or removal call.
hrach
Člen | 1834
+
+1
-

@mates transakce funguji uplne stejne. tj. to co chces dosahnout, to tak opravdu funguje a bude v poradku.

co se tyce api, na cem se vola persist – to stare funguje a porad bude, to nove ti umozni to delat primo na modelu. prakticky jsou ale vnitrnosti stejne dost prepsane, a ohledne persistovani je dost zmena v kaskade, tj. je urcite si nastudovat definini relatioship properties.

Vastlik
Člen | 58
+
0
-

Mám toto query Jak získám výsledek?
Zkouším, ale query, je jiné.

		dump($this->orm->vouchers->findByUserIdFromYesterday($userId));

Editoval Vastlik (13. 3. 2016 13:57)

hrach
Člen | 1834
+
0
-

@Vastlik jestli to dobre chapu, tak ten screen je z mapperu. tj. musis udelat nad repository anotaci @method, aby udelal proxy. viz. dokumentace: https://nextras.org/…0/repository

Vastlik
Člen | 58
+
0
-

hrach napsal(a):

@Vastlik jestli to dobre chapu, tak ten screen je z mapperu. tj. musis udelat nad repository anotaci @method, aby udelal proxy. viz. dokumentace: https://nextras.org/…0/repository

v repository mám:

* @method ICollection|Voucher[] findByUserIdFromYesterday(int $userId)

ale já potřebuji získat jenom tu sumu

Editoval Vastlik (13. 3. 2016 19:27)

Jan Tvrdík
Nette guru | 2595
+
0
-

@hrach Tj. chce se vyhnout hydrataci a dost možná vůbec nepoužít ten builder.

Vastlik
Člen | 58
+
0
-

Jan Tvrdík napsal(a):

@hrach Tj. chce se vyhnout hydrataci a dost možná vůbec nepoužít ten builder.

@hrach @JanTvrdík To co potřebuji je použít agregační funkci sum v sql abych spočítal celkový obnos za který se prodalo 7 dní zpátky. Vím, že bych mohl vzít data a projet je foreach, ale proč to dělat, když to umí databáze.

hrach
Člen | 1834
+
0
-

@Vastlik aha, nepodival jsem se poradne, co tam delas. Muzes si tedy napsat vlastni proxy. (v repository zavolas $this->mapper->getSum...()). Nicmene, protoze to nema moc co delat s Orm, normalne bych to presunul do vlastni servisni tridy, ktera jako dependency bude mit Connection.

Vastlik
Člen | 58
+
0
-

hrach napsal(a):

@Vastlik aha, nepodival jsem se poradne, co tam delas. Muzes si tedy napsat vlastni proxy. (v repository zavolas $this->mapper->getSum...()). Nicmene, protoze to nema moc co delat s Orm, normalne bych to presunul do vlastni servisni tridy, ktera jako dependency bude mit Connection.

@hrach aha tak teď nějak nechápu ten způsob implementace. Nemohl by jsi mi ho trochu přiblížit prosím?
Díky

hrach
Člen | 1834
+
0
-

@Vastlik nechapu, co, nechapes. zpusob implementace automaticke proxy, vlastni proxy, hydratace, ci navrhovaneho reseni?

Vastlik
Člen | 58
+
0
-

@hrach Myslím implementaci navrhovaného řešení. + co dělá proxy? (Chápu co je proxy, ale v kontextu ORM nevím.)

Editoval Vastlik (14. 3. 2016 21:48)

hrach
Člen | 1834
+
+2
-

Reseni:

class MyClass
{
	private $connection;
	public function __construct(Nextras\Dbal\Connection $connection)
	{
		$this->connection = $connection;
	}
	public function findSumById()
	{
			$this->connection->createQueryBuilder()->select()->from()...
	}
}

Ad proxy: no proste pokud mas metodu v mapperu, tak se k ni pres repository dostanes pomoci proxy metody, ne?

class UsersRepository
{
	public function findSumBy(...$args)
	{
		return $this->mapper->findSumBy(...$args);
	}
}
$orm->users->findSumBy();
Vastlik
Člen | 58
+
0
-

@hrach super, moc díky, funguje. :)

Editoval Vastlik (15. 3. 2016 14:55)

Vastlik
Člen | 58
+
0
-

Ahoj,
mám Entitu ve které mám

 * @property-read DateTime $expirationDate {virtual}
 * @property DateTime $createdAt {default 'now'}
 * @property VoucherType $voucherType {m:1 VoucherType::$vouchers}
.
.
.
protected function getterExpirationDate()
    {
        $currentDate = $this->createdAt;
        return $currentDate->add(new \DateInterval('P'.$this->voucherType->validity.'D'));
    }

Ale tato funkce ovlivňuje i property createdAt. Tzn., že pokud se snažím získat entitu, tak createdAt == expirationDate.
Pokud vymažu funkci getterExpirationDate, tak se createdAt změní zpátky na správnou hodnotu, která je v DB.

Editoval Vastlik (19. 3. 2016 11:35)

hrach
Člen | 1834
+
+1
-
$currentDate = clone $this->createdAt;
Vastlik
Člen | 58
+
0
-

@hrach Moc díky :)

goood
Člen | 26
+
0
-

ahoj, jsem asi trošku natvrdlej, nebo nevím.
V mapperu si pomocí builderu stavím dotaz

<?php
public function findByEventId ( $eventId ) {
	return $this ->builder() -> select('company.*') ->from('action') -> innerJoin ('action', 'company', 'company', 'action.company_id = company.id') -> where('event_id = ' . $eventId) -> groupBy( 'company_id');
}
?>

Ale vygenerovaný dotaz vypadá takto:

SELECT ``.* FROM action INNER JOIN company AS `company` ON (action.company_id = company.id) WHERE event_id = 12 GROUP BY company_id

Chtěl bych aby výsledek byl

SELECT company.* FROM action INNER JOIN company AS `company` ON (action.company_id = company.id) WHERE event_id = 12 GROUP BY company_id

Co dělám prosím špatně?

goood
Člen | 26
+
0
-

goood napsal(a):

ahoj, jsem asi trošku natvrdlej, nebo nevím.
V mapperu si pomocí builderu stavím dotaz

<?php
public function findByEventId ( $eventId ) {
	return $this ->builder() -> select('company.*') ->from('action') -> innerJoin ('action', 'company', 'company', 'action.company_id = company.id') -> where('event_id = ' . $eventId) -> groupBy( 'company_id');
}
?>

Ale vygenerovaný dotaz vypadá takto:

SELECT ``.* FROM action INNER JOIN company AS `company` ON (action.company_id = company.id) WHERE event_id = 12 GROUP BY company_id

Chtěl bych aby výsledek byl

SELECT company.* FROM action INNER JOIN company AS `company` ON (action.company_id = company.id) WHERE event_id = 12 GROUP BY company_id

Co dělám prosím špatně?

Zajímavé je, že takto to funguje, ale ne efektivně

<?php
return $this ->builder() -> select('[c.*]') -> from('[company]', 'c') -> innerJoin ('c', '[action]', 'a', '[a.company_id] = [c.id]') -> where('[a.event_id] = ' . $eventId) -> groupBy( 'company_id');
?>
hrach
Člen | 1834
+
0
-

@goood sic nevim, v cem je problem, na to mrknu pozdeji, tak upozornuji, ze delas neuveritelnou bezpecnostni chybu a prasarnicku! ma to byt

->where('[a.event_id] = %i', $eventId)