Nextras\ORM – ORM nad Nextras\Dbal

wassy
Člen | 46
+
0
-

Pomohlo, super, díky moc :)

Mám ještě jeden dotaz, celý den se snažím zprovoznit vazbu m:n ale skončil jsem na erroru: has not defined a symetric relationship in

Jel jsem podle dema a dokumentace, a myslím, že mám všechno tak jak se tam píše:

Entity:

namespace Orm;

use Nextras\Orm\Entity\Entity;
use Nextras\Orm\Relationships\ManyHasMany;

/**
 * Contact
 * @property int $id
 * @property string $name
 * @property string $email
 * @property string $telephone
 * @property ManyHasMany|Project[] $projects {m:n ProjectsRepository}
 */

class Contact extends Entity{
}

a

namespace Orm;

use Nextras\Orm\Entity\Entity;
use Nextras\Orm\Relationships\ManyHasMany;

/**
 * Project
 * @property int $id
 * @property string $name
 * @property ManyHasMany|Contact[] $contacts {m:n ProjectsRepository primary}
 */
class Project extends Entity {
}

Co dělám špatně? Díky za trpělivost a jakoukoli radu :D

Editoval wassy (17. 3. 2015 18:21)

hrach
Člen | 1834
+
0
-

@wassy U entity Project mas spatne nadefinovanou cilovou repository, ma tam byt ContactsRepository.

wassy
Člen | 46
+
0
-

hrach napsal(a):

@wassy U entity Project mas spatne nadefinovanou cilovou repository, ma tam byt ContactsRepository.

To jsem pak opravil, nicméně pořád stejná chyba…zkoušel jsem i vytvořit znova databázi podle struktury z dema a pořád to samé.

Nevím jestli to má vliv, ale v demu je ještě Extras/Migrations, je to k tomu potřeba?

hrach
Člen | 1834
+
0
-

@wassy jeste me napada, mas obe repository pridane v modelu? Jinak asi zdrojak, bez toho neporadim.

wassy
Člen | 46
+
0
-

hrach napsal(a):

@wassy jeste me napada, mas obe repository pridane v modelu? Jinak asi zdrojak, bez toho neporadim.

stačí app složka? https://github.com/…123/orm-test

hrach
Člen | 1834
+
0
-

@wassy kdyby si to sem aspon spravne nakopiroval. v Contact mas prohozeny anotace, anotace s property nejsou u tridy, ale volne, u tridy mas soubory anotace.

saimons
Člen | 293
+
0
-

Ahoj, zatim se seznamuji obecne s ORM a zkousim si to v hlave nejak poskladat. Libi se mi tvuj projekt, protoze ma aspon zakladni demo + dokumentaci. Mam vsak jeden dotaz, je mozne nekde (mozna v Mapperu) predat konkretni DB context? Pripojuju se do vice DB a ruzne druhy pripojeni si v soucasnosti drzim jako sluzby, ktere vraci context.

Editoval saimons (18. 3. 2015 14:00)

wassy
Člen | 46
+
0
-

hrach napsal(a):

@wassy kdyby si to sem aspon spravne nakopiroval. v Contact mas prohozeny anotace, anotace s property nejsou u tridy, ale volne, u tridy mas soubory anotace.

Díky, popravdě mě ani nenapadlo že anotace musí být přímo u třídy, nicméně teď už mi to dává smysl :D … Ale narazil jsem na další problém. Jel jsem zase podle dema a dokumentace a zase mi přijde že mám všechno stejně, nicméně když se snažím vypsat vazbu 1:m, tak se dotaz provede (v tracy je zaznamenaný a když ho přepíšu do admineru tak mi vrátí to co potřebuju), ale nevím jak se mám dostat k těm datům, abych je např. v šabloně vypsal

{foreach $project->tasks as $task}
...
{/foreach}

Nemohl by ses ještě jednou podívat do toho repozitáře a poradit co dělám špatně? Když zavolám $project->tasks->count() tak mi to píše 0, ale když zavolám $project->tasks->countStored() tak mi to vrátí počet řádků které chci…

Díky za trpělivost ;) Nevím jak jinak bych na to měl přijít než se zeptat, prošel jsem už všechno co jsem našel :)

hrach
Člen | 1834
+
0
-

@saimons slovo „context“ me trochu mate, orm jede ted nad nextras\dbal, ktery v contructoru bere connection, nad ktrou ma pracovat. v neonu muzes podstcit rucne connection jakou chces:

services:
	orm.mappers.users: My\UsersMapper(@myconnection, ...)

@wassy budes muset pripojit i dump db, abych to otestoval. mas poslendi verzi dbalu a orm?

wassy
Člen | 46
+
0
-

@hrach

"nextras/dbal": "@dev",
"nextras/orm": "@dev",

databázi jsem přidal do repozitáře

edit: Už jsem na to přišel, problém byl v tom, že jsem měl špatně pojmenované sloupce v tabulkách…

Editoval wassy (18. 3. 2015 23:21)

hrach
Člen | 1834
+
0
-

@wassy muzes to lip popsat? treba by slo to nejak kontrolovat a vyhodit exception.

edit: zrovna koukam na to sql a vypada to, ze ti chybel suffix. to jsem zrovna vcera fixoval, aby to nevadilo. v tom smeru bylo prave dulezity, jakou mas verzi – to, ze mas dev je faj, ale zalezi, ze kdy ten dev mas… :)

Editoval hrach (18. 3. 2015 23:29)

wassy
Člen | 46
+
0
-

hrach napsal(a):

@wassy muzes to lip popsat? treba by slo to nejak kontrolovat a vyhodit exception.

edit: zrovna koukam na to sql a vypada to, ze ti chybel suffix. to jsem zrovna vcera fixoval, aby to nevadilo. v tom smeru bylo prave dulezity, jakou mas verzi – to, ze mas dev je faj, ale zalezi, ze kdy ten dev mas… :)

Nejsem si ted uplne jisty jestli odpovim spravne, protoze si nejsem jisty jak moc dobre rozumim composeru a repozitarum, ale kdyz jsem composer updatoval včera tak mam ten poslední @dev , je to tak? :D

Problém byl konkrétně v tom, že jsem měl v tabulce tasks sloupec project, který se měl odkazovat do tabulky projects, a vyřešilo se to tím, že jsem ten sloupec přejmenoval na project_id

hrach
Člen | 1834
+
0
-

@wassy to je ono, zalezi kdy vcera si updatoval, tuto chybu jsem opravil az vecer po 11: https://github.com/…446133929a2d

Editoval hrach (18. 3. 2015 23:46)

wassy
Člen | 46
+
0
-

hrach napsal(a):

@wassy to je ono, zalezi kdy vcera si updatoval, tuto chybu jsem opravil az vecer po 11: https://github.com/…446133929a2d

Tak to už nevím, nicméně ten problém je vyřešen, ale mám zase další :D

Entity:

/**
 * Task
 * @property string $name
 * @property DateTime|null $deletedAt
 * @property Project $project {m:1 ProjectsRepository $allTasks}
 * @property Task|NULL $parentId {m:1 TasksRepository $subtasks}
 * @property OneHasMany|Task[] $subtasks {1:m TasksRepository $parentId}
 * @property ManyHasMany|User[] $users {m:n UsersRepository}
 */
class Task extends Entity{
}
/**
 * Project
 * @property string $name
 * @property DateTime $createdAt
 * @property ManyHasMany|Contact[] $contacts {m:n ContactsRepository primary}
 * @property OneHasMany|Task[] $allTasks {1:m TasksRepository}
 * @property-read Task[] $tasks {virtual}
 */
class Project extends Entity {
    public function getterTasks(){
        return $this->allTasks->get()->findBy(['deletedAt' => NULL]);
    }
}

Ještě přidávám schéma databáze, kde jdou dobře vidět relace

A při pokusu o přidání nového tasku:

			$task = new \Orm\Task;
$task->name = $values->name;
$task->project = $values->project;
$task->parentId = $values->parent;

dostávám hlášku: Entity is not attached to repository. u $task->project i $task->parentId , pravděpodobně mám špatně napsané ty property, ale nemůžu přijít na to jak to napsat jinak…

Editoval wassy (19. 3. 2015 0:02)

hrach
Člen | 1834
+
0
-

http://nextras.cz/…aster/entity

If you are connecting entities, at least one of them has to be attached to its repository.

wassy
Člen | 46
+
0
-

hrach napsal(a):

http://nextras.cz/…aster/entity

If you are connecting entities, at least one of them has to be attached to its repository.

No jel jsem podle toho dema, co se dělalo na některé posobotě, a tam je přidávání komentářů a tam to funguje, jaký je mezi tím rozdíl?

hrach
Člen | 1834
+
0
-

Entity vytazene z databaze jsou uz attachovane. V demu se k nove vytvarenemu komentu pripojuje post, ktery je uz v db a je attachovany.

wassy
Člen | 46
+
0
-

hrach napsal(a):

Entity vytazene z databaze jsou uz attachovane. V demu se k nove vytvarenemu komentu pripojuje post, ktery je uz v db a je attachovany.

Já mám ale ten projekt už taky vytvořený, ve formuláři jen vybírám ze selectu ke kterému projektu se ten task připojí, achjo :D já asi pořád nechápu jak to funguje :D

edit: Tak už to jde :D a dokonce mi to i dává smysl :D

Editoval wassy (19. 3. 2015 1:06)

wassy
Člen | 46
+
0
-

Co dělám špatně, když dostávám hlášku Property Orm\Project::$database is not nullable. ?

Property:

* @property OneHasOne|Database $database {1:1 DatabasesRepository} //Entita Project
* @property OneHasOne|Project $project {1:1 ProjectsRepository} //Entita Database

Vím že vztah 1:1 není nic moc, ale je to kvůli přehlednosti…jde o to že u detailu projektu vypisuji, která databáze k němu patří. databases.project má výchozí hodnotu NULL, nicméně, když ji nenastavím žádnou hodnotu, tak pořád stejná chyba. Co ta chyba znamená?

Matey
Člen | 142
+
0
-

@wassy skús pre tú Project::$database povoliť NULL

* @property OneHasOne|Database|NULL $database {1:1 DatabasesRepository} //Entita Project

@hrach je potrebné do anotácii písať typ väzby OneHasMany, …? nestačí definácia {1:m …}
teda všetko je funkčné aj bez toho, ale prináša to nejakú funkcionalitu?

Editoval Matey (19. 3. 2015 18:11)

Tirus91
Člen | 199
+
0
-

@hrach
ahoj,
prosím tě, nasadil jsem si dev verzi nextras/orm i dbal a po fetch z repository mi to hodí následující chybu

Nextras\Dbal\Exceptions\QueryException

Unknown or incorrect time zone: 'Europe/Prague'

Předpokládám že to bude problém s DateTime v entitě

/**
 * User
 * @property-read int $id
 * @property string $username
 * @property string $email
 * @property string|null $firstname
 * @property string|null $surname
 * @property DateTime $created
 * @property DateTime|null $logged
 * @property Language $language
 * @property Attachment|null $avatar
 * @property string|null $activationcode
 * @property boolean $mailing
 * @property boolean $active
 * @property boolean $canbedeleted
 */
class User extends Entity
{
}

Nette database funguje v pohodě, ale předpokládám, že tam se asi tenhle set timezone nevyužívá.

Nette: 2.3
Mysql: 5.6.22
PHP: 5.5.14
Windows 8.1

Editoval Tirus91 (19. 3. 2015 20:09)

wassy
Člen | 46
+
0
-

@Matey To jsem samozřejmě zkoušel a výsledkem bylo to, že když jsem si vydumpoval $project->database tak měl hodnotu NULL, ikdyž v tabulce databases je záznam, který by to mělo vrátit :(

wassy
Člen | 46
+
+1
-

@Tirus91 Problém je v mysql, řešení je tady

Matey
Člen | 142
+
+1
-

@wassy tak v dokumentácii sa píše že väzbu 1:1 treba dodržať na oboch stranách, tomu ale neodpovedá štruktúra tvojej db, takže použi väzbu 1:1d a malo by to byť ok

väzbu si držíš v tabuľke databases, čiže v entite Database nastav:

@property OneHasOne|Project $project {1:1d ProjectsRepository primary} //Entita Database

a v entite Project

@property OneHasOne|Database $database {1:1d DatabasesRepository} //Entita Project
Matey
Člen | 142
+
0
-

@hrach po prechode z nette/database na nextras/dbal mi tento kód generuje iný sql dotaz

<?php
$array = [];
$images = $this->orm->images->findBy(['id!=' => $array]);
//dbal: SELECT `images`.* FROM `images` `images` WHERE 1=0 => 0 rows
//database: SELECT DISTINCT `images`.* FROM `images` WHERE (`images`.`id` IS NULL OR TRUE) => 144 rows
$array = [1,2,3];
$images = $this->orm->images->findBy(['id!=' => $array]);
//dbal: SELECT `images`.* FROM `images` `images` WHERE images.id NOT IN (1, 2, 3) => 141 rows
//database: SELECT DISTINCT `images`.* FROM `images` WHERE (`images`.`id` NOT IN (1, 2, 3)) => 141 rows

$images = $this->orm->images->findBy(['id!=' => empty($array) ? NULL : $array])
// takto vždy dostanem to čo požadujem
?>

chyba v orm / dbal?


a ešte toto sa vyskytlo:

<?php
$this->orm->episodes->getBy(['number' => $episode, 'this->season->number' => $season, 'this->season->serial->slug' => $serial]);
?>

Nextrax/Dbal ⇒ ERROR
Nextras\Dbal\Exceptions\QueryException – Not unique table/alias: ‚seasons‘

SELECT `episodes`.*
FROM `episodes` `episodes`
LEFT JOIN seasons `seasons` ON (`episodes`.`season_id` = `seasons`.`id`)
LEFT JOIN seasons `seasons` ON (`episodes`.`season_id` = `seasons`.`id`) // 2x
LEFT JOIN serials `serials` ON (`seasons`.`serial_id` = `serials`.`id`)
WHERE ((episodes.number = '01') AND (seasons.number = '01'))
AND (serials.slug = 'heart-of-dixie')
LIMIT 1

Nette/Database ⇒ OK

SELECT DISTINCT `episodes`.*
FROM `episodes`
LEFT JOIN `seasons` AS `season_id` ON `episodes`.`season_id` = `season_id`.`id`
LEFT JOIN `serials` AS `serial_id` ON `season_id`.`serial_id` = `serial_id`.`id`
WHERE (`episodes`.`number` = '01') AND (`season_id`.`number` = '01')
AND (`serial_id`.`slug` = 'heart-of-dixie')
LIMIT 1

Editoval Matey (20. 3. 2015 0:39)

hrach
Člen | 1834
+
+1
-

Všechno bylo od @Matey zodpovězeno a zda se ze spravne, diky moc! Zbyva jedine zodpovedet:

@property OneHasOne|Database|NULL $database {1:1 DatabasesRepository}
@hrach je potrebné do anotácii písať typ väzby OneHasMany, …? nestačí definácia {1:m …} teda všetko je funkčné aj bez toho, ale prináša to nejakú funkcionalitu?

  • typ u property se pouziva pouze pro validaci, prevazne u „normalnich“ property, u tech, co drzi vazu se z toho vyuziva jen informace o povoleni „null“. Typ entity, ktera se pripojeje, je kontrolovan tez, ale uz na jine urovni nez v jinych pripadech (repository).
  • OneHasOne je dokonce spatne, to tam nema co delat, protoze entity neni tohoto typu, tohoto typu je objekty, ktery se o danou vazbu stara.
  • object, ktery se o vazbu stara lze ziskat pomoci metody getProperty().
  • object, ktery se o vazbu stara je vracen v pripade *hasMany properties. Tam to data smysl, aby vam to napovidalo ->add, ->get, ->set, ->remove metody…
  • myslim ze je to pekne videt v orm demo, ktere pouziva jen anotaci *HasMany.

Editoval hrach (19. 3. 2015 23:35)

hrach
Člen | 1834
+
0
-

@Matey diky za report, zitra fixnu.

hrach
Člen | 1834
+
+2
-

@Matey fixed. Diky!

Tirus91
Člen | 199
+
0
-

@hrach
ahoj,
na narazil jsem na problém co se týče timezone na produkci. Například zákazník má hosting od Wedosu, kde timezone nejsou a tak řeším jak toto obejít. Dá se to nějak prosím?

A ještě jen info. Když využívám findBy(), jde u toho využít LIKE? Nebo si musím simulovat findBy() v Mapperu?

Editoval Tirus91 (22. 3. 2015 21:42)

hrach
Člen | 1834
+
0
-

@Tirus91

  • to je slozite, byt tebou bych to reklamoval u hostingu, ze bez toho neni mozne pouzivat timezony, respektive sloupec timestamp (a to ani v pripade, ze mas web jen pro CR, protoze zde mame letni a zimni cas a funkce TIMEDIFF prestane fungovat, pokud je system nastaven jen offsetem, coz by default je.)
  • pridal jsem konfiguracni volbu auto-offset, ktera pouzije timezonu v php, ale nastavi ji offsetem. doporučuji NEPOUŽÍVAT, má vliv na funkci TIMEDIFF a další funkce, které pracují s rozdílí timestampu a nějak je provnávají.
  • findBy & like – nejde. Musis pres mapper.
Tirus91
Člen | 199
+
0
-

@hrach

  • již jsem to reklamoval, poprosili mne ať se obrátím na tebe :) Pokud to jinak nejde (chápu důvody), tak je budu tlačit aby to tam nacpali. K něčemu to tam přeci dobrý je
  • findBy & like – chápu jak to myslíš, je nějaký bestpractice pro tenhle případ? defakto potřebuju hledat podle čehokoliv jako je u findBy (o co mi jde? Napojení na nextras/datagrid a zprovoznit filtrování – našel jsem u tebe jen příklady na nette database, nikoliv na nextras/dbal)

Editoval Tirus91 (23. 3. 2015 17:55)

hrach
Člen | 1834
+
+1
-

@Tirus91 :)) jak rikam, je to mozne vypnout, ale porad to nic nemeni, ze diky tomu nejsi schopen pouzivat funkci TIMEDIFF na timestamp sloupcich – a to s dbalem nema zadnou souvislost. Pokud to nepouzivas, tak ti to nemusi vadit, jen na to upozornuju, protoze je to chyba, na kterou se prichazi velmi tezko.

k tomu like: normalne v mapperu si implementovat funkci search a v ni pouzit query builder.

Editoval hrach (23. 3. 2015 18:19)

Tirus91
Člen | 199
+
0
-

@hrach díky za info. fci timediff nikde nevyužívám, tudíž zatím pojedu bez toho :)

k like:
Zkouším to následovně, ale to není správnej příklad asi. Nenašel jsem dokumentaci k mapperu a ani nějaký demo na něco podobného.

public function findFilter($params){
		$params = ['title'=>['relation'=>'LIKE','value'=>'%th%'];
     $qb = $this->builder();
     foreach($params as $column => $property){
        $qb->andWhere($column.' '.$property['relation'].' ?',$property['value']);
     }
     return $qb;
 }

Editoval Tirus91 (23. 3. 2015 18:39)

hrach
Člen | 1834
+
0
-

nevim co vsechno muze byt relation, a pokud to je bezpecne, tak to muzes udelat treba takto:

$params = ['title'=> ['relation'=>'LIKE', 'value'=>'%th%'];
$builder = $this->builder();
foreach($params as $column => $property) {
	$qb->andWhere("%column {$property['relation']} %any", $column, $property['value']);
}
return $builder;
Tirus91
Člen | 199
+
0
-

@hrach
v relation bude jen to co si tam já sám napíšu. z GUI tam nic nepůjde.

Jinak, jak by to šlo udělat bezpečně?

jinak, zkoušel jsem tečkovou notaci na where author.username like..

to tu nějak nejde. Jak to jde v tom builderu?

edit:
author.username – vyřešil jsem, nedošlo mi, že tam musí být left join a následně to jde jako klasický SQL query

Editoval Tirus91 (23. 3. 2015 20:41)

wassy
Člen | 46
+
0
-

Nevím jestli to je nějaký bug nebo něco dělám blbě… Na localu mi všechno jde OK, ale na online serveru mi nefunguje výpis vazby m:1..

Entity:

/**
 * Project
 * @property string $name
 * @property DateTime $createdAt
 * @property OneHasMany|ProjectNote[] $allNotes {1:m ProjectNotesRepository $projectId}
 * @property-read ProjectNote[] $notes {virtual}
 */
class Project extends Entity {
    public function getterNotes(){
        return $this->allNotes->get()->orderBy(['createdAt' => ICollection::DESC]);
    }
}
/**
 * ProjectNote
 * @property string $text
 * @property DateTime $createdAt
 * @property Project $projectId {m:1 ProjectsRepository $allNotes}
 * @property OneHasMany $userId {m:1 UsersRepository $projectNotes}
 */
class ProjectNote extends Entity{
}
/**
 * User
 * @property string $username
 * @property OneHasMany|ProjectNote[] $projectNotes {1:m ProjectNotesRepository $userId}
 */
class User extends Entity{
}

Na localu mi vpohodě jede:

{foreach $notes as $note}
	<strong class="pull-left primary-font">{$note->userId->name}</strong>
	<small class="pull-right text-muted"><span class="glyphicon glyphicon-time"></span> {$note->createdAt|date:'j. m. Y'}</small>
	<br>
	<li>{$note->text}</li>
	{sep}<hr class="sep">{/sep}
{/foreach}

Ale na ostrém serveru se do toho foreach vůbec nedostanu, když jsem zkoušel vypsat $notes->count() tak dostávám nulu ale $notes->countStored() vrací správný počet řádků, a jde vidět že se provádí správný dotaz na databázi, vůbec nevím, kde by mohl být problém…

Díky za jakoukoli radu

hrach
Člen | 1834
+
0
-

@wassy:
Chapu to tak, ze dany foreach, respektive notes, vraci prazdny iterator. Tedy:

  • spousti se na produkci i locale stejny dotaz do db?
  • ma produkcni i lokalni db stejnou strukturu? (zejmena primarni a cizi klice?)

Jinak tip: defaultni razeni relationship lze udelat v anotaci (nic moc syntax, ale lepsi nez dratem do oka):

* @property OneHasMany|ProjectNote[] $allNotes {1:m ProjectNotesRepository $projectId order:createdAt,DESC}
wassy
Člen | 46
+
0
-

@hrach Dotazy jsou stejné a struktura taky, pro jistotu jsem celou tabulku z produkce smazal a naimportoval vyexportovanou z localu…

hrach
Člen | 1834
+
0
-

@wassy nevim jak ti pomoci, bud na to musis prijit sam nebo mi poskytnout vyrazne vice inforamci :( kdyztak pres mail… :)


edit: vyreseno, tradicne cache.

Editoval hrach (5. 4. 2015 11:07)

wassy
Člen | 46
+
0
-

Snažím se pomocí ORM, dostat z databáze počet záznamů v jednotlivém měsíci (nějaký takový dotaz: SELECT month(date) as month, count(id) as logsPerMonth FROM `logs WHERE user_id = „.$userId.“ GROUP BY month(date)` , v mapperu se pomocí tohoto:

public function findLogChart($userId)
    {
        return $this->connection->query("SELECT month(date) as month, count(id) as logsPerMonth FROM `logs` WHERE user_id = ".$userId." GROUP BY month(date)");
    }

k tomuto dotazu dostanu, nicméně pak nějak nevím, jak se k těm datům dostat…neporadil by mi někdo nějaký postup?

hrach
Člen | 1834
+
0
-

@wassy nejjednoduseji asi pres proxy metodu v repository.

public function findLogChart($userId)
{
	return $this->mapper->findLogChart($userId);
}
hrach
Člen | 1834
+
+6
-

Stable 1.0.0 je konecne tady! Vcetne dokumentace: http://nextras.cz/orm/docs/

wassy
Člen | 46
+
0
-

Potřeboval bych použít auto offset ale nevím, kde a jak ho mužů konfigurovat, mohl by mi někdo poradit?

hrach
Člen | 1834
+
0
-

@wassy co to prosim je? nemam vubec tuseni :-O

hrach
Člen | 1834
+
0
-

Uz mi to doslo. To je zalezitost dbalu: V neonu:

dbal:
	connectionTz: auto-offset
wassy
Člen | 46
+
0
-

hrach napsal(a):

Uz mi to doslo. To je zalezitost dbalu: V neonu:

dbal:
	connectionTz: auto-offset

tisíceré díky :D

goood
Člen | 26
+
0
-

Ahoj,
zkouším použít pro jeden projekt tvoje ORM. Narazil jsem na problém, pokud mám pojmenované sloupce v tabulce s počátečním velkým písmenem. Entita vypadá takto:

/**
 * @property string $Title
 */
class Event extends Entity {

}

V presenteru si zjistím entitu s ID 1, což podle Tracy projde dobře

App\Event #b44e
preloadContainer private => Nextras\Orm\Collection\EntityIterator #f196
position private => 1
data private => array (1)
0 => App\Event #b44e { RECURSION }
iteratable private => array (1)
0 => App\Event #b44e { RECURSION }
hasSubarray private => FALSE
metadata protected => Nextras\Orm\Entity\Reflection\EntityMetadata #b192
className private => "App\Event" (9)
primaryKey private => array (1)
0 => "id" (2)
properties private => array (2)
id => Nextras\Orm\Entity\Reflection\PropertyMetadata #7d65 { ... }
Title => Nextras\Orm\Entity\Reflection\PropertyMetadata #4289 { ... }
repository private => App\EventsRepository #db7b
data private => array (1)
id => 1
validated private => array (1)
id => FALSE
modified private => array ()
persistedId private => 1

ale když v šabloně zavolám property Title

Toto je udalost {$event->Title}

tak vyhodi vyjimku Property App\Event::$Title is not set

Pokud to v entitě i v šabloně změním na malá písmena, tak je vše ok. To je nějaká konvence, že počáteční písmeno property musí být malé?

goood
Člen | 26
+
0
-

Zdravím, řeším problém a stále nevím co dělám špatně

Mám takovouto db strukturu

CREATE TABLE IF NOT EXISTS `company` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(500) NOT NULL,
  `street` varchar(200) DEFAULT NULL,
  `city` varchar(150) DEFAULT NULL,
  `ic` varchar(10) DEFAULT NULL,
  `zip` int(11) unsigned DEFAULT NULL,
  `web` varchar(250) DEFAULT NULL,
  `phone` varchar(20) DEFAULT NULL,
  `country_id` int(11) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `country_id` (`country_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

CREATE TABLE IF NOT EXISTS `country` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `iso_3166_1_alpha_3_code` varchar(3) NOT NULL,
  `name` varchar(150) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=250 ;

ALTER TABLE `company`
  ADD CONSTRAINT `company_ibfk_1` FOREIGN KEY (`country_id`) REFERENCES `country` (`id`);

A pak entity

/**
 * @property string $name
 * @property string|NULL $street
 * @property string|NULL $city
 * @property string|NULL $ic
 * @property string|NULL $zip
 * @property string|NULL $web
 * @property string|NULL $phone
 * @property Country $country {m:1 CountryRepository}
 */
class Company extends Entity {

}
/**
 * @property string $iso_3166_1_alpha_3_code
 * @property string $name
 * @property OneHasMany|Company[] $companies {1:m CompanyRepository}
 */
class Country extends Entity {

}

Když v presenteru udělám

$Company = new App\Company();
$Company->name = $values['name'];
$Country = $this -> orm -> countries ->getById($values['countryid']);
$Company->country = $Country;
$this->orm->companies->persistAndFlush($Company);

Tak dostanu hlášku

Unknown column 'country' in 'field list'

SQL

INSERT INTO `company` (`name`, `street`, `city`, `ic`, `zip`, `web`, `phone`, `country`) VALUES ('firm', NULL, NULL, NULL, NULL, NULL, NULL, 4)

Už nevím co s tím, jak to mám správně oanotovat, aby to fungovalo?

Díky za postrčení

hrach
Člen | 1834
+
0
-

@goood

  • urcite zkus smazat cache :) pokud si ten cizi klic vytvoril pozdej, tak v cachi neni, tj. se neostranuje ten suffix.
  • pripadne zalezi, jakou mas storage reflection, pokud mas cammelCase, tak by to ocekavalo v db sloupec countryId, a ne country_id.
  • ohledne $entity->Property to jeste proverim :)
  • diky moc za otazky :)
goood
Člen | 26
+
0
-

@hrach Díky! Vymazání cache pomohlo. Teď tu ale bojuju s další věcí a už jsem zoufalej.

Mám následující entity

<?php
namespace App;

use Nextras\Orm\Entity\Entity;

/**
 * @property string $firstname
 * @property string $lastname
 * @property string|NULL $email
 * @property string|NULL $phone
 * @property Company $company {m:1 CompanyRepository}
 * @property WorkPosition $workPosition {m:1 WorkPositionRepository}
 */
class ContactPerson extends Entity {

}
<?php
namespace App;

use Nextras\Orm\Entity\Entity,
    Nextras\Orm\Relationships\OneHasMany;

/**
 * @property string $name
 * @property string|NULL $street
 * @property string|NULL $city
 * @property string|NULL $ic
 * @property int|NULL $zip
 * @property string|NULL $web
 * @property string|NULL $email
 * @property string|NULL $phone
 * @property Country $country {m:1 CountryRepository}
 * @property Category $category {m:1 CategoryRepository}
 * @property OneHasMany|ContactPerson[] $contactPersons {1:m ContactPersonRepository}
 * @property Branch $branch {m:1 BranchRepository}
 */
class Company extends Entity {

}

model:

<?php
namespace App;

use Nextras\Orm\Model\Model;

/**
 * @property-read EventRepository $events
 * @property-read CountryRepository $countries
 * @property-read CategoryRepository $categories
 * @property-read BranchRepository $branches
 * @property-read CompanyRepository $companies
 * @property-read ContactPersonRepository $contactpersons
 * @property-read WorkPositionRepository $workpositions
 */
class Orm extends Model
{
}

Ale při spuštění aplikace píše

Nextras\Orm\InvalidStateException

App\Company::$contactPersons relationship with App\ContactPerson::$company is not symetric

Já tam nic špatně nevidím, ale možná už mám vlčí mlhu…