Doctrine a vazba entit, User – Role

NouF
Člen | 67
+
0
-

Ahoj,

co mám špatně na vazbě entit, že mi při dumpu Login entity nevrátí groups entitu, ale (unset)

Dump

/**
 * @ORM\Entity(repositoryClass="App\Model\Database\Repository\LoginRepository")
 * @ORM\Table(name="`login`")
 */
class Login extends AbstractEntity implements UserEntityInterface
{

...

/**
     * @var Collection $groups
     * @ORM\ManyToMany(targetEntity="LoginGroup")
     * @ORM\JoinTable(
     *     name="login_login_group",
     *     joinColumns={@ORM\JoinColumn(name="id_login", referencedColumnName="id")},
     *     inverseJoinColumns={@ORM\JoinColumn(name="id_login_group", referencedColumnName="id")}
     *)
     */
    private Collection $groups;
/**
 * @ORM\Entity(repositoryClass="App\Model\Database\Repository\LoginGroupRepository")
 * @ORM\Table(name="`login_group`")
 */
class LoginGroup extends AbstractEntity
{
    /**
     * @var int
     *
     * @ORM\Id
     * @ORM\Column(type="integer", options={"default"="nextval('login_group_id_seq'::regclass)"})
     * @ORM\GeneratedValue(strategy="SEQUENCE")
     * @ORM\SequenceGenerator(sequenceName="""login_group_id_seq""", allocationSize=1, initialValue=1)
     */
    private int $id;

    /**
     * @var string
     * @ORM\Column(type="string", length=255, nullable=FALSE, unique=false)
     */
    private string $name;

    /**
     * @var string
     * @ORM\Column(type="string", length=255, nullable=FALSE, unique=false)
     */
    private string $shortName;

    /**
     * @var string
     * @ORM\Column(type="string", length=255, nullable=FALSE, unique=false)
     */
    private string $description;

    /**
     * @return int
     */
    public function getId(): int
    {
        return $this->id;
    }

    /**
     * @return string
     */
    public function getName(): string
    {
        return $this->name;
    }

    /**
     * @param string $name
     */
    public function setName(string $name): void
    {
        $this->name = $name;
    }

    /**
     * @return string
     */
    public function getShortName(): string
    {
        return $this->shortName;
    }

    /**
     * @param string $shortName
     */
    public function setShortName(string $shortName): void
    {
        $this->shortName = $shortName;
    }

    /**
     * @return string
     */
    public function getDescription(): string
    {
        return $this->description;
    }

    /**
     * @param string $description
     */
    public function setDescription(string $description): void
    {
        $this->description = $description;
    }
}

SQL

-- Adminer 4.7.7 PostgreSQL dump

DROP TABLE IF EXISTS "login";
DROP SEQUENCE IF EXISTS login_id_seq;
CREATE SEQUENCE login_id_seq INCREMENT 1 MINVALUE 1 MAXVALUE 2147483647 START 1 CACHE 1;

CREATE TABLE "public"."login" (
    "id" integer DEFAULT nextval('login_id_seq') NOT NULL,
    "username" character varying NOT NULL,
    "password" character varying NOT NULL,
    "created" timestamp NOT NULL,
    "deleted" timestamp,
    CONSTRAINT "login_pk" PRIMARY KEY ("id")
) WITH (oids = false);


DROP TABLE IF EXISTS "login_group";
DROP SEQUENCE IF EXISTS login_group_id_seq;
CREATE SEQUENCE login_group_id_seq INCREMENT 1 MINVALUE 1 MAXVALUE 2147483647 START 1 CACHE 1;

CREATE TABLE "public"."login_group" (
    "id" integer DEFAULT nextval('login_group_id_seq') NOT NULL,
    "name" character varying NOT NULL,
    "short_name" character varying NOT NULL,
    "description" character varying NOT NULL,
    CONSTRAINT "login_group_pk" PRIMARY KEY ("id")
) WITH (oids = false);


DROP TABLE IF EXISTS "login_login_group";
CREATE TABLE "public"."login_login_group" (
    "id_login" integer NOT NULL,
    "id_login_group" integer NOT NULL,
    CONSTRAINT "login_login_group_pk" PRIMARY KEY ("id_login", "id_login_group"),
    CONSTRAINT "login_login_group_login_fk" FOREIGN KEY (id_login) REFERENCES login(id) MATCH FULL ON UPDATE CASCADE ON DELETE RESTRICT NOT DEFERRABLE,
    CONSTRAINT "login_login_group_login_group_fk" FOREIGN KEY (id_login_group) REFERENCES login_group(id) MATCH FULL ON UPDATE CASCADE ON DELETE RESTRICT NOT DEFERRABLE
) WITH (oids = false);

INSERT INTO "login_login_group" ("id_login", "id_login_group") VALUES
(1,	1);

-- 2021-05-05 11:10:53.198346+02

Moc děkuju

David Grudl
Nette Core | 8227
+
0
-

Tohle předpokládám nesouvisí s Nette.

NouF
Člen | 67
+
0
-

David Grudl napsal(a):

Tohle předpokládám nesouvisí s Nette.

Jakto? Asi jsem něco přehlédl, že na nette foru, nemůžu položit otázku ohledně nette doctrine?

Martk
Člen | 661
+
0
-

Máš smazanou cache? Tohle mi dělalo, když jsem zapomněl smazat. Jinak vždy v constructoru by mělo být toto:

$this->groups = new ArrayCollection();
NouF
Člen | 67
+
0
-

Martk napsal(a):

Máš smazanou cache? Tohle mi dělalo, když jsem zapomněl smazat. Jinak vždy v constructoru by mělo být toto:

$this->groups = new ArrayCollection();

Ahoj,

moc děkuju, snažím se mazat. V tom constructoru, má to bejt v obou entitách?

Ono mi to ani nevygeneruje SQL dotaz v ladence. Působí to, jak když to nepracuje s tou vazební tabulkou.

M

Martk
Člen | 661
+
0
-

Je to vždy u properties, kde je anotace ManyToMany nebo OneToMany. Použil jsi unidirectional vazbu, takže jen u Login. Dává se to tam kvůli tomu, abys potom mohl volat $entity->groups->add(new Group(...))

Co dumpne toto?

bdump($this->em->getClassMetadata(Login::class)->associationMappings);

Editoval Martk (5. 5. 2021 15:55)

NouF
Člen | 67
+
0
-

Martk napsal(a):

Je to vždy u properties, kde je anotace ManyToMany nebo OneToMany. Použil jsi unidirectional vazbu, takže jen u Login. Dává se to tam kvůli tomu, abys potom mohl volat $entity->groups->add(new Group(...))

Co dumpne toto?

bdump($this->em->getClassMetadata(Login::class)->associationMappings);
array (0)
Martk
Člen | 661
+
0
-

Doctrine vůbec nezaregistrovala tvojí asociaci a co dumpne toto?

bdump((new \Doctrine\ORM\Tools\SchemaValidator($this->em))->validateMapping());

// nebo jen ta konkrétní třída

(new SchemaValidator($this->em))->validateClass($this->em->getClassMetadata(Login::class))

Editoval Martk (5. 5. 2021 16:19)

uestla
Backer | 799
+
0
-

NouF napsal(a):

David Grudl napsal(a):

Tohle předpokládám nesouvisí s Nette.

Jakto? Asi jsem něco přehlédl, že na nette foru, nemůžu položit otázku ohledně nette doctrine?

Ona je to více záležitost Doctrine a PHP, než samotného nette doctrine, který je jen most mezi Nette a Doctrine, nicméně:

Ono mi to ani nevygeneruje SQL dotaz v ladence. Působí to, jak když to nepracuje s tou vazební tabulkou.

Tohle je proto, že Doctrine implicitně nenačítá všechny vazby dané entity – pokud bys k té kolekci ale přistoupil, tak už to dotaz udělá.

NouF
Člen | 67
+
0
-

uestla napsal(a):

NouF napsal(a):

David Grudl napsal(a):

Tohle předpokládám nesouvisí s Nette.

Jakto? Asi jsem něco přehlédl, že na nette foru, nemůžu položit otázku ohledně nette doctrine?

Ona je to více záležitost Doctrine a PHP, než samotného nette doctrine, který je jen most mezi Nette a Doctrine, nicméně:

Tomu rozumím, ale bral jsem, že toto je forum kam chodí lidi co mají zkušenosti s nette = velká šance, že někdo řešil to stejné. Jestli je to problém, to se omlouvám, ale nedokážu si představit, že komunita bude chodit na github do issue „pomáhat někomu v komunitě“

Jinak děkuji za vysvětlení.

M

NouF
Člen | 67
+
0
-

Martk napsal(a):

Doctrine vůbec nezaregistrovala tvojí asociaci a co dumpne toto?

bdump((new \Doctrine\ORM\Tools\SchemaValidator($this->em))->validateMapping());

// nebo jen ta konkrétní třída

(new SchemaValidator($this->em))->validateClass($this->em->getClassMetadata(Login::class))

oboje mi nevrátí nic. (stejné jako předtim)

> (new SchemaValidator($this->em))->validateClass($this->em->getClassMetadata(Login::class))

toto očekává něco jiného.
https://snipboard.io/5Di6pd.jpg

Když dumpnu toto:

dumpe($this->em->getClassMetadata(Login::class));

dump

Editoval NouF (5. 5. 2021 20:59)

Martk
Člen | 661
+
+1
-

Je to divné, nevím v čem by mohla být chyba, pro jistotu se ještě ujisti, zda je správně smazaná cache jak doctrine anotací, tak samotné doctrine nebo vypnout na chvíli cache

Pro nettrine takto:

nettrine.annotations:
	cache: Doctrine\Common\Cache\ArrayCache

nettrine.orm.cache:
	metadataCache: Doctrine\Common\Cache\ArrayCache
NouF
Člen | 67
+
0
-

Martk napsal(a):

Je to divné, nevím v čem by mohla být chyba, pro jistotu se ještě ujisti, zda je správně smazaná cache jak doctrine anotací, tak samotné doctrine nebo vypnout na chvíli cache

Pro nettrine takto:

nettrine.annotations:
	cache: Doctrine\Common\Cache\ArrayCache

nettrine.orm.cache:
	metadataCache: Doctrine\Common\Cache\ArrayCache

smazal jsem celej kontainer a už alespon vidim nejaký progress. Asi to opravdu byla nějaká cache, ale nerozumim tomu. složku cache jsem promazával. Moc děkuju za trpělivost. Jdu to dořešit dál.

dump

uestla
Backer | 799
+
0
-

Je to jak jsem psal výše – Doctrine implicitně data z vazebních tabulek nenačítá, proto je tam PersistentCollection, která má initialized: false – jakmile nad tou kolekcí pustíš foreach nebo budeš chtít získat její položky, dotaz se položí.

Felix
Nette Core | 1245
+
0
-

Trochu jsem to zkoumal a nedeje se mi to. Pro vetsi debug bych potreboval nejake PoC, na kterem to vyzkouset.