nette a entity v doctrine
- ondrusu
- Člen | 118
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
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
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
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)
- harmim
- Člen | 26
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
- harmim
- Člen | 26
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