Nextras\ORM – ORM nad Nextras\Dbal
- wassy
- Člen | 46
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)
- wassy
- Člen | 46
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?
- wassy
- Člen | 46
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
- saimons
- Člen | 293
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
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 | 1838
@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?
- hrach
- Člen | 1838
@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
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 | 1838
@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
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 | 1838
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
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?
- wassy
- Člen | 46
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
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
@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
@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)
- Matey
- Člen | 142
@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
@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 | 1838
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)
- Tirus91
- Člen | 199
@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 | 1838
@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
@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 | 1838
@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
@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 | 1838
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
@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
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 | 1838
@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
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?
- goood
- Člen | 26
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
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 | 1838
@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
@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…