我很难弄清楚如何在zend框架中正确使用Doctrine 2。我正在阅读文档并根据我目前的工作和zendcasts。当我尝试使用我的数据库来处理关系数据时,问题实际上就开始了,因为我不太确定如何使用学说集合。在我的测试情况下,我有一个用户实体:使学说有意义的问题2
class User
{
/**
* @var integer
* @Column (name="id", type="integer", nullable=false)
* @Id
* @GenerateValue(strategy="IDENTIY")
*
*/
private $id;
/**
* @Column(type="string",length=60,nullable=true)
* @var string
*/
private $email;
/**
*
* @param \Doctring\Common\Collections\Collection $property
* @OneToMany(targetEntity="Countries",mappedBy="user", cascade={"persist", "remove"})
*/
private $countries;
public function __get($property)
{
return $this->$property;
}
public function __set($property, $value)
{
$this->$property = $value;
}
}
这是关系到国家的实体:
class Countries {
/**
* @var integer
* @Column (name="id", type="integer", nullable=false)
* @Id
* @GenerateValue(strategy="IDENTIY")
*
*/
private $id;
/**
*
* @var string
* @Column(type="string")
*/
private $countryName;
/**
*
* @var User
* @ManyToOne(targetEntity="User")
* @JoinColumns({
* @JoinColumn(name="user_id", referencedColumnName="id")
* })
*/
private $user;
public function __get($property)
{
return $this->$property;
}
public function __set($property, $value)
{
$this->$property = $value;
}
}
现在我可以用的东西分配来自控制器的国家是这样的:
$p1 = new \Federico\Entity\Countries();
$p1->countryName = 'Argentina';
$p2 = new \Federico\Entity\Countries();
$p2->countryName = 'España';
$u = new \Federico\Entity\User();
$u->firstname = 'John';
$u->lastname = 'Doe';
$u->id = 1;
这将显示此对象:
object(Federico\Entity\User)[109]
private 'id' => int 1
private 'email' => null
private 'countries' =>
array
0 =>
object(Federico\Entity\Countries)[107]
private 'id' => null
private 'countryName' => string 'Argentina' (length=9)
private 'user' => null
1 =>
object(Federico\Entity\Countries)[108]
private 'id' => null
private 'countryName' => string 'España' (length=7)
private 'user' => null
public 'firstname' => string 'John' (length=4)
public 'lastname' => string 'Doe' (length=3)
如果您注意到这一点,您会看到country对象中的user属性设置为null。我不明白这是否应该像这样发生。此外,由于用户将被允许从复选框列表中选择国家,并且他们可以选择多个国家,......国家不应该以某种方式存储在Db中吗?
不知道,如果我们两个认识其他@的Ondrej Mirtes,假设我只是要允许用户从4个不同的国家(这是他可以选择所有选择其中1个或2个......)这些国家不应该已经存储在一个表中并且分配给country_id吗?我以前曾用zend_db做过这样的事情,我有三个表:用户,国家和user_has_countries。我不太清楚我怎么能应用这样的教义,虽然 –
在这种情况下,你想要一个用户和国家之间的多对多关系。一个用户可以有很多国家,一个国家可以有很多用户。您只需要担心用户和国家实体; Doctrine将自行处理连接表(user_has_countries,在您的旧模式中)。 – timdev