nette a entity v doctrine

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

Ahojte, učím se Nette a napadlo mě že si k tomu připojím doctrine 2, je to dobrá věc.
Nejsem si však jistej jestli jsem pochopil správě práci s entitami.
Mám následující datový model – viz obrázek,
https://dl.dropboxusercontent.com/…ovyModel.png
A zajímalo by mě co všechno patří do entity User.
Rezervations určitě že?? A bude tam patřit i UserInfo?
Tato tabulka dělá to, že při každém přihlášení loguje uživatele že se přihlásil v kolik, ip adresa a prohlížeč.

A také by mě zajímalo zda by user_info mělo jít přes model User nebo UserInfo.
Díky za odpověď, doufám že moje otázka není uplně blbá.

Editoval ondrusu (28. 1. 2016 14:14)

harmim
Člen | 26
+
+1
-

Každé databázové tabulce, která není spojovací pro manyToMany vazby by měla odpovídat jedna entita. Ve tvém případě bude User, Reservations i LoginInfo každá jako samostatné entita. Mezi nimi budeš mít vazby.

/** @ORM\Entity */
class User
{

 	/**
     * @ORM\Id @Column(type="integer")
     * @ORM\GeneratedValue
	 * @var int
     */
	private $id;

	...

	/**
	* @ORM\OneToMany(targetEntity="LoginInfo", mappedBy="user")
	* @var LoginInfo[]
	*/
	private $loginInfo;

	/**
	* @ORM\OneToMany(targetEntity="Reservation", mappedBy="user")
	* @var Reservation[]
	*/
	private $reservations;
}


/** @ORM\Entity */
class LoginInfo
{

 	/**
     * @ORM\Id @Column(type="integer")
     * @ORM\GeneratedValue
	 * @var int
     */
	private $id;

	...

	/**
	* @ORM\ManyToOne(targetEntity="User", inversedBy="loginInfo")
 	* @ORM\JoinColumn(name="user_id")
	* @var User
	*/
	private $user;
}

/** @ORM\Entity */
class Reservation
{

 	/**
     * @ORM\Id @Column(type="integer")
     * @ORM\GeneratedValue
	 * @var int
     */
	private $id;

	...

	/**
	* @ORM\ManyToOne(targetEntity="User", inversedBy="reservations")
 	* @ORM\JoinColumn(name="user_id")
	* @var User
	*/
	private $user;
}
ondrusu
Člen | 118
+
0
-

aha, jasně nachvíli sem se do toho zamotal… díky moc :)

ondrusu
Člen | 118
+
0
-

ještě jeden dotaz, mám třídu co mě naíčtá data z entity tzv. „fasády“, můžu v jedné fasádě volat jinou fasádu?
Třeba tady koukám na it network

	public function addComment(Article $article, $user, $content)
	{
		$comment = new ArticleComment();
		$comment->content = $content;
		$comment->date = new DateTime();
		$comment->article = $article;
		$comment->author = $user;
		$this->em->persist($comment);
		$this->em->flush();
	}
}

Konkrétně ve fasádě User chci uložit do login_info záznam při přihlášení, jde to dělat i jinak je uvedený příklad??

harmim
Člen | 26
+
-1
-

Fasády nemusí nutně být 1:1 k entitám.

Asi bych to udělal nějak takhle

class UserFacade
{
	public function addLoginInfo(User $user)
	{
		$ipAddress = $this->httpRequest->getRemoteAddress();
		$browser = ...;
		// v LoginInfo si můžeš napsat buď settery nebo můžeš ip adresu, uživatele a prohlížeč vyžadovat v konstrukoru, pokud je to povinné
		$loginInfo = new LoginInfo();
		$loginInfo->setIpAddress($ipAddress);
		$loginInfo->setBrowser($browser);
		$loginInfo->setUser($user);
		$user->addLoginInfo($loginInfo);
		$this->em->persist($loginInfo);
		$this->em->flush();
	}
}
/** @ORM\Entity */
class User
{

 	/**
    * @ORM\OneToMany(targetEntity="LoginInfo", mappedBy="user")
    * @var LoginInfo[]
    */
    private $loginInfo;

	public function addLoginInfo(LoginInfo $loginInfo)
	{
		$this->loginInfo[] = $loginInfo;
	}
}

Editoval harmim (28. 1. 2016 15:37)

ondrusu
Člen | 118
+
+1
-

a bude v entitě User napojení na tabulku acl_roles?
V uživatelích mám id role, ale já bych potřeboval string role (idčko mě nic neřekne žj)

harmim
Člen | 26
+
0
-

User musí mít vazbu manyToMany na acl.

/** @ORM\Entity */
class User
{

     /**
     * @ManyToMany(targetEntity="Acl")
     * @JoinTable(name="acl_roles",
     *      joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")},
     *      inverseJoinColumns={@JoinColumn(name="acl_id", referencedColumnName="id")}
     *      )
	 * @var Acl[]
     */
    private $aclRoles;
}

S tím, že v tabulce acl_roles bys měl mít cizí klíč user_id a acl_id. Musíš si samozřejmě vytvořit a namapovat entitu Acl

ondrusu
Člen | 118
+
0
-

Já mám jednu roli pro více uživatelů ale každý uživatel může mít jen jednu roli

harmim
Člen | 26
+
+1
-

V tom případě to bude vypadat nějak takhle

/** @ORM\Entity */
class User
{

    /**
     * @ManyToOne(targetEntity="Acl")
     * @JoinColumn(name="acl_id", referencedColumnName="id")
	 * @var Acl
     */
    private $aclRole;
}

Podívej se na asociace v Doctrine dokumentaci

ondrusu
Člen | 118
+
+1
-

jj super, díky moc za pomoc. :)