doctrine join ostatních entit

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
ondrusu
Člen | 118
+
0
-

Ahoj, omlouvám se za mé spamerské dotazy. Narazil jsem na jednu věc a potřeboval bych poradit od člověka (google jsem popravdě ještě nezkoušel – hledat).
Mám entitu User, do které mám napojené role, atributy, pomocné role.
Od jisté doby mi metoda getUser (která vrací celou entitu User) přestala vracet role, atributy apod. Vrací pouze vše z základní tabulky user. Jakoby to nenačítalo ArrayCollection. Mohly by jste mi poradit jak je to možné? Co dělám špatně?
Doctrine má nějakou cache že by ta entita byla třeba velká …
USER ENTITA:

namespace App\Model\Entities;

use Doctrine\ORM\Mapping as ORM;
use Kdyby\Doctrine\Entities\BaseEntity;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * Doctrine entity for table Users.
 * @package App\Model\Entities
 * @ORM\Entity
 * @ORM\Table(name="user")
 *
 */
class User extends BaseEntity {

    /** Konstanty pro uživatelské role. */
    const ROLE_ADMIN = 1;

    /**
     * Sloupec pro ID uživatele.
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     */
    protected $id;

    /**
     * Sloupec pro heslo.
     * @ORM\Column(type="string")
     */
    protected $password;

    /**
     * Sloupec pro email.
     * @ORM\Column(type="string")
     */
    protected $email;

    /**
     * Sloupec pro jméno.
     * @ORM\Column(type="string")
     */
    protected $first_name;

    /**
     * Sloupec pro přijmení.
     * @ORM\Column(type="string")
     */
    protected $last_name;

    /**
     * Sloupec s datem vytvoření daného uživatele.
     * @ORM\Column(type="datetime")
     */
    protected $created;

    /**
     * Sloupec s ID uživatele, který stávajícího uživatele vytvořil.
     * @ORM\Column(type="integer")
     */
    protected $created_by;

    /**
     * Sloupec s datem editace daného uživatele.
     * @ORM\Column(type="datetime")
     */
    protected $edited;

    /**
     * Sloupec s ID uživatele, který stávajícího uživatele editoval.
     * @ORM\Column(type="integer")
     */
    protected $edited_by;

    /**
     * Sloupec pro zobrazení aktivity.
     * @ORM\Column(type="boolean")
     */
    protected $active;

    /* ------------------------- Association Mapping ------------------------ */

    /**
     * Sloupec role uživatele.
     * @ORM\ManyToOne(targetEntity="AclRole", inversedBy="ac_user")
     * @ORM\JoinColumn(name="role_id", referencedColumnName="id")
     *
     */
    protected $role;

    /**
     * Sloupec role uživatele.
     * @ORM\ManyToOne(targetEntity="Tm1Role", inversedBy="ac_user")
     * @ORM\JoinColumn(name="tm1_role_id", referencedColumnName="id")
     *
     */
    protected $tm1_role;

    /**
     * Namapovaná vazba uživatele 1:N na tabulku logů příhlášení.
     * @ORM\OneToMany(targetEntity="UserLoginInfo", mappedBy="user")
     */
    protected $ac_login_info;

    /**
     * Namapovaná vazba uživatele 1:N na tabulku s nastavením účtu uživatele.
     * @ORM\OneToMany(targetEntity="UserAttribute", mappedBy="user")
     */
    protected $ac_user_attribute;

    /* --------------------------- Entity Methods --------------------------- */

    /** Konstruktor s inicializací objektů pro vazby mezi entitami. */
    public function __construct() {
        parent::__construct();
        $this->ac_login_info = new ArrayCollection();
        $this->ac_user_attribute = new ArrayCollection();
    }

NAPŘÍKLAD ROLE:

namespace App\Model\Entities;

use Doctrine\ORM\Mapping as ORM;
use Kdyby\Doctrine\Entities\BaseEntity;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * Doctrine entity for table AclRole.
 * @package App\Model\Entities
 * @ORM\Entity
 * @ORM\Table(name="acl_role")
 *
 *
 * Rodič(ID) má 0 až více potomků(ID) (1:0..N)
 * Rodič potomka(ID) je uložen v parent_id u potomka
 */
class AclRole extends BaseEntity {

    /**
     * Sloupec pro ID role.
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     *
     */
    protected $id;

    /**
     * Sloupec pro jméno role.
     * @ORM\Column(type="string")
     */
    protected $name;

    /**
     * Sloupec pro ID rodiče (PARENT)
     * @ORM\Column(name="parent_id", type="integer")
     */
    protected $parent;

    /**
     * Sloupec pro zobrazení aktivity.
     * @ORM\Column(type="boolean")
     */
    protected $active;

    /**
     * Sloupec pro zobrazení aktivity.
     * @ORM\Column(type="boolean")
     */
    protected $editable;

    /**
     * Sloupec s datem vytvoření dané role.
     * @ORM\Column(type="datetime")
     */
    protected $created;

    /**
     * Sloupec s ID uživatele, který stávající roly vytvořil.
     * @ORM\Column(type="integer")
     */
    protected $created_by;

    /**
     * Sloupec s datem editace dané role.
     * @ORM\Column(type="datetime")
     */
    protected $edited;

    /**
     * Sloupec s ID uživatele, který stávající roly editoval.
     * @ORM\Column(type="integer")
     */
    protected $edited_by;


    /* ------------------------- Association Mapping ------------------------ */

    /**
     *
     * Namapovaná vazba role 1:N na seznam všech uživatelů.
     * Jedna role má N uživatelů.
     *
     * @ORM\OneToMany(targetEntity="User", mappedBy="role")
     */
    protected $ac_user;

    /**
     *
     * Namapovaná vazba role 1:N na seznam všech oprávnění.
     * Jedna role má N oprávnění.
     *
     * @ORM\OneToMany(targetEntity="Acl", mappedBy="role")
     */
    protected $ac_acl;

    /* --------------------------- Entity Methods --------------------------- */

    public function __construct() {
        parent::__construct();
        $this->ac_user = new ArrayCollection();
        $this->ac_acl = new ArrayCollection();
    }

    public function addUser(User $user) {
        $this->ac_user[] = $user;
        $user->role = $this;
    }

    public function addAcl(Acl $acl) {
        $this->ac_acl[] = $acl;
        $acl->role = $this;
    }

A zde je ukázka dumpu: (třeba se z toho dá něco poznat)

App\Model\Entities\User #4743
id protected => 1
password protected => "$2y$10$a3IqDdOr9mWQt4wFpGD5puDFgJ8ekUOAowMCO7FmhBRgPSCjb9DwO" (60)
email protected => "admin" (5)
first_name protected => "Jan" (3)
last_name protected => "Sršeň" (7)
created protected => DateTime #c81e
date => "-0001-11-30 00:00:00" (20)
timezone_type => 3
timezone => "Europe/Prague" (13)
created_by protected => 1
edited protected => NULL
edited_by protected => NULL
active protected => TRUE
role protected => Kdyby\GeneratedProxy\__CG__\App\Model\Entities\AclRole #e525
__initializer__ => Closure #c407
file => "F:\Dokumenty\www\devel\trunk\vendor\doctrine\orm\lib\Doctrine\ORM\Proxy\ProxyFactory.php" (88)
line => 164
variables => array (2) [ ... ]
parameters => "$proxy" (6)
__cloner__ => Closure #b962
file => "F:\Dokumenty\www\devel\trunk\vendor\doctrine\orm\lib\Doctrine\ORM\Proxy\ProxyFactory.php" (88)
line => 212
variables => array (2) [ ... ]
parameters => "$proxy" (6)
__isInitialized__ => FALSE
id protected => 1
name protected => NULL
parent protected => NULL
active protected => NULL
editable protected => NULL
created protected => NULL
created_by protected => NULL
edited protected => NULL
edited_by protected => NULL
ac_user protected => NULL
ac_acl protected => NULL
tm1_role protected => Kdyby\GeneratedProxy\__CG__\App\Model\Entities\Tm1Role #8c7e
__initializer__ => Closure #4473
file => "F:\Dokumenty\www\devel\trunk\vendor\doctrine\orm\lib\Doctrine\ORM\Proxy\ProxyFactory.php" (88)
line => 164
variables => array (2) [ ... ]
parameters => "$proxy" (6)
__cloner__ => Closure #a8e5
file => "F:\Dokumenty\www\devel\trunk\vendor\doctrine\orm\lib\Doctrine\ORM\Proxy\ProxyFactory.php" (88)
line => 212
variables => array (2) [ ... ]
parameters => "$proxy" (6)
__isInitialized__ => FALSE
id protected => 1
name protected => NULL
parent protected => NULL
active protected => NULL
editable protected => NULL
created protected => NULL
created_by protected => NULL
edited protected => NULL
edited_by protected => NULL
ac_user protected => NULL
ac_tm1_acl protected => NULL
ac_login_info protected => Doctrine\ORM\PersistentCollection #56b7
ac_user_attribute protected => Doctrine\ORM\PersistentCollection #9524

Díky za případnou odpověď.

David Matějka
Moderator | 6445
+
0
-

getUser? myslis jako ze tridy Security\User? Ty tu tvou entitu pouzivas jako identitu? jak presne? muzes ukazat authenticator?

ondrusu
Člen | 118
+
0
-

aha to mě nedošlo… Nee mé UserFasády

public function getUser($id) {
    if (isset($id)) {
        return $this->em->find(User::class, $id);
    }
    return NULL;
}

Zde je ten authentifikator: (ale asi ho už nepotřebuješ)

    public function authenticate(array $credentials) {
        list($username, $password) = $credentials;

        $user = $this->getUserByEmail($username);

        if (is_null($user)) // Neexistující uživatel
            $this->badLoginException(self::IDENTITY_NOT_FOUND, $this->translator->translate("login.user.invalidUserOrPassword"), $this->translator->translate("login.user.notFound"));

// zde jsou nejake kontroly jesli se rovna heslo, apodobne

// pokud je vse ok
        $login_id = $this->addUserLoginInfo($user);

        return new Identity($user->email, $user->role->name, array("entity" => $user, "login_id" => $login_id));
    }

Taky nevím jestli je dobrý nápad si ukládat do Identity celou UserEntitu

David Matějka
Moderator | 6445
+
0
-

takhle ukladat entitu do identity neni dobry napad, koukni na https://github.com/…ity-doctrine (a nainstaluj @dev verzi, stable neni kompatibilni s nette 2.3)

a jak se to teda chova, kdyz se dotazes na nejakou tu asociaci?

ondrusu
Člen | 118
+
0
-

Například když ukládám uživatele v editUser ve fasádě (a samozřejmě tam ukládám i roli a atributy) tak to vypíše chybu
ErrorException: Creating default object from empty value in
To chápu jako že do objektu ukládám null.
Prostě v entitě user když se zeptam na jakoukoliv věc z ArrayCollection, tak tam není.
Taky mám problém třeba s ajaxem, když si pošlu dotaz a chci vědět co se tam odesílá tak si to dumpnu přes var_dump a napíšu die() – to abych to viděl v tom response tak mi ten request napíše 200 OK a navyšuje se pamět, timeout a pak to spadne až ten request dosáhne 1GB (spadne jako že mi prohlížeč napíše „ajeje něco se porouchalo“). Vůbec nevim co tam mám špatně a jak postupovat abych tu chybu našel.