Nextras\ORM chybějící sloupce

Rudolf247
Člen | 38
+
0
-

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.

https://ibb.co/kxRk5GV

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…

Rudolf247
Člen | 38
+
0
-

Aha, tak už jsem přišel na to, že to musí být zapsané camelCase. Takže $originalText atd. v Translation už mi funguje. Achjo, no ale každopádně furt nechápu ten problém se $description, tam to je přeci správně…

mskocik
Člen | 53
+
+1
-

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)

Rudolf247
Člen | 38
+
0
-

Díky moc! Jo jasně, vím že to tak nemusí být ale jakmile nemám nastavené konvence tak se to bere dle defaultu, to už mi docvaklo. A ano stirng|null také funguje.

Takže za mě vyřešno.