Nextras\ORM chybějící sloupce
- Rudolf247
- Člen | 38
Zdravím, bojuju s takovou záhadou, ale jen jsem možná něco blbě pochopil. Koukal jsem i na prezentace na Youtube ohledně tohoto ORM, ale můj problém se nevyřešil.
Mám model:
<?php
namespace App\Model\Orm\Games;
use App\Model\Orm\Translations\Translation;
use Nextras\Orm\Entity\Entity;
use Nextras\Orm\Relationships\OneHasMany;
/**
* Games Entity.
* @property int $id {primary}
* @property string $name
* @property string $description
* @property \DateTimeImmutable $date_added {default now}
* @property OneHasMany|Translation[] $translations {1:m Translation::$ref_games, orderBy=[id=ASC]}
*/
class Game extends Entity
{
}
Repository:
<?php
namespace App\Model\Orm\Games;
use Nextras\Orm\Repository\Repository;
class GameRepository extends Repository
{
public static function getEntityClassNames(): array
{
return [Game::class];
}
public function findAllGames()
{
return $this->findAll();
}
}
(Zde mám funkci findAllGames() jen pro zkoušku, když už jsem byl bezradný, vím že se k findAll() dostanu i z Manageru.
Zde mám Mapper:
<?php
namespace App\Model\Orm\Games;
use Nextras\Orm\Mapper\Mapper;
class GameMapper extends Mapper
{
protected $tableName = 'games';
}
Kdyžtak ještě poskytuji RepositoryContainer (Orm model):
<?php
namespace App\Model\Orm;
use App\Model\Orm\Games\GameRepository;
use App\Model\Orm\Translations\TranslationRepository;
use App\Model\Orm\TranslationProposals\TranslationProposalsRepository;
use App\Model\Orm\TranslationVotes\TranslationVotesRepository;
use App\Model\Orm\Users\UserRepository;
use Nextras\Orm\Model\Model;
/**
* Model
*
* @property-read GameRepository $games
* @property-read TranslationVotesRepository $translationVotesRepository
* @property-read TranslationRepository $translationRepository
* @property-read TranslationProposalsRepository $translationProposalsRepository
* @property-read UserRepository $userRepository
*/
class RepositoryContainer extends Model
{
}
No appka běží, a jde mi do DB zapisovat. Problém přichází ve chvíli,
kdy chci data z DB dostat.
Děje se to u všech modelů, ale tenhle dávám jako příklad.
Zde mám funkci v manageru (ať tu máme celý proces):
/**
* @return ICollection
*/
public function getAllGames(): ICollection
{
return $this->gameRepository->findAllGames();
}
Tady máme presenter:
public function renderList()
{
$games = $this->gameManager->getAllGames();
foreach ($games as $game) {
Debugger::barDump($game->name);
Debugger::barDump($game->description);
}
$this->template->games = $this->gameManager->getAllGames();
}
latte asi není potřeba, protože to samé se děje i zde, když si výsledek dumpnu.
No a teď už konečně k problému. $game->name se normálně vypíše,
ale $game->description hodí chybu:
Property App\Model\Orm\Games\Game::$description is not set.
id taky funguje normálně, ale date_added opět ne.
Nextras\dbal query panel:
SELECT `games`.* FROM `games` AS `games`
A ano vážně v DB tyto sloupce mám. Vše fungovalo když jsem fungoval přes normální database, ale rozhodl jsem se přejít na nějaké ORM.
Ještě jsem zde při psaní tohoto příspěvku chtěl dát fetchAll() a všiml jsem si že při Dumpu se v prvním záznamu „description“ nezobrazí (v DB je jako NULL) u druhého záznamu zde je jako prázdný string (v DB je prázdný string) a druhý záznam byl doplněn už pomocí ORM. První záznam byl ještě z původního zápisu.
Zde je ještě vidět že properties načtené jsou.
https://ibb.co/cbDX4zF
Každopádně date_added je vyplněno u obou dvou záznamů.
U Modelu, která patří k tabulce translations (kde mám přes 222.000 záznamů), kde je vyplněno u všech „game_id“, „uid“, „original_text“, „translated_text“, „version“ a „last_updated“:
<?php
namespace App\Model\Orm\Translations;
use App\Model\Orm\Games\Game;
use App\Model\Orm\TranslationProposals\TranslationProposals;
use App\Model\Orm\Users\User;
use Nextras\Orm\Entity\Entity;
use Nextras\Orm\Relationships\OneHasMany;
/**
* Translations Entity.
* @property int $id {primary}
* @property int $game_id {default 1}
* @property string $uid
* @property string $original_text
* @property string|null $translated_text
* @property int $version
* @property \DateTimeImmutable $last_updated {default now}
* @property bool|null $is_updated
* @property int|null $updated_by
* @property int|null $approved_by
* @property Game $ref_games {m:1 Game::$translations}
* @property User $ref_updated_by {m:1 User::$updated_translations}
* @property User $ref_approved_by {m:1 User::$approved_translations}
* @property OneHasMany|TranslationProposals[] $proposals {1:m TranslationProposals::$ref_translation, orderBy=[id=ASC]}
*/
class Translation extends Entity
{
}
Tak mi to vrací jen „id“,„uid“ a „version“ nic víc.
Prosím nevíte, kde může být problém, řeším to už druhý den…
- mskocik
- Člen | 61
Tie properties NEmusíš mať ako camelCase, viď dokumentácia, ale je to default.
S description bude asi ten problém, že to definuješ ako
string
a nie ako string|null
Editoval mskocik (29. 8. 2023 18:40)