doctrine join ostatních entit
- ondrusu
- Člen | 118
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
getUser? myslis jako ze tridy Security\User? Ty tu tvou entitu pouzivas jako identitu? jak presne? muzes ukazat authenticator?
- ondrusu
- Člen | 118
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
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
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.