Doctrine a vazba entit, User – Role
- NouF
- Člen | 67
Ahoj,
co mám špatně na vazbě entit, že mi při dumpu Login entity nevrátí groups entitu, ale (unset)
/**
* @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
- NouF
- Člen | 67
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
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
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
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
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
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
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));
Editoval NouF (5. 5. 2021 20:59)
- Martk
- Člen | 661
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
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.