我正在尝试使用2进入Doctrine 2。我有两个数据库表:
广告
用户表
现在我有了一个表单来添加一个新的广告,当我将广告保存在我的表中时,我想注入advert_user_id。我创建了两个实体:
/** Advert
*
* @ORM\Table(name="advert")
* @ORM\Entity(repositoryClass="Advert\Repository\AdvertRepository")
*/
class Advert
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var integer
*
* @ORM\Column(name="advert_user_id", type="integer", nullable=false)
*/
private $advertUserID;
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="adverts")
* @ORM\JoinColumn(name="advert_user_id", referencedColumnName="id")
*/
protected $user;
/**
* Set advertUserID
*
* @param integer $advertUserID
* @return Advert
*/
public function setAdvertUserID($advertUserID)
{
$this->advertUserID = (int) $advertUserID;
return $this;
}
/**
* Get advertUserID
*
* @return integer
*/
public function getAdvertUserID()
{
return $this->advertUserID;
}
/**
* Set user
*
* @param \Advert\Entity\User $user
* @return Advert
*/
public function setUser(\Advert\Entity\User $user = null)
{
$this->user = $user;
return $this;
}
/**
* Get user
*
* @return \Advert\Entity\User
*/
public function getUser()
{
return $this->user;
}和下面的用户实体
/**
* User
*
* @ORM\Table(name="user")
* @ORM\Entity
*/
class User
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @ORM\OneToMany(targetEntity="Advert", mappedBy="user")
*/
private $adverts;在我的控制器中,我现在尝试执行以下操作:
if ($form->isValid())
{
$advert->setAdvertUserID('13'); //Static for testing
$this->getEntityManager()->persist($advert));
$this->getEntityManager()->flush();不幸的是,数据库中的条目始终为空。如果我删除广告实体中的@ORM\ManyToOne $user,它就能工作。设置允许我通过“广告”实体读出用户名,那么为什么我不能在“广告”表中保存用户ID呢?
发布于 2014-08-27 07:43:39
据我所知,您的会话中存储了user_id,您希望使用广告保存用户,而不首先从数据库中获取整个用户实体。这听起来是个好主意,只需少执行一个查询。
这样做的方法是:
首先,把你的广告实体从不必要的,而不是按照Doctrine2规范,$advertUserID相关的东西:)
/** Advert
*
* @ORM\Table(name="advert")
* @ORM\Entity(repositoryClass="Advert\Repository\AdvertRepository")
*/
class Advert
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="adverts")
* @ORM\JoinColumn(name="advert_user_id", referencedColumnName="id")
*/
protected $user;
/**
* Set user
*
* @param \Advert\Entity\User $user
* @return Advert
*/
public function setUser(\Advert\Entity\User $user = null)
{
$this->user = $user;
return $this;
}
/**
* Get user
*
* @return \Advert\Entity\User
*/
public function getUser()
{
return $this->user;
}
}然后通过引用广告添加用户:
$user_id = 13
$entityManager = $this->getEntityManager();
// get User by reference (no queries executed)
$user = $entityManager->getReference('Advert\Entity\User' , $user_id);
// set the User in the Advert using the setUser method
$advert->setUser($user);
// Persist and flush!
$entityManager->persist($advert));
$entityManager->flush();现在,您可以在and表中找到一个user_id,并且没有执行额外的查询来执行此操作。阅读更多关于参考代理在Doctrine2文档中。
发布于 2014-08-26 20:08:25
首先,我建议不要明确地命名表和列(除非您有一个很好的理由)。另外,您通常不需要指定JoinColumn,让Doctrine来处理这些事情,这样会使生活更加轻松。
接下来,您的实体应该对每个列或关系都有getter和setter。此外,User实体应该有一个构造函数,它将$adverts字段初始化为ArrayCollection对象。(原则有一个用于实体方法生成的CLI命令;不知道它是如何与ZF集成的,在SF2中是doctrine:generate:entities)
现在,对于实际的问题:您不能从user对象访问advert的原因是因为您从未设置过这种关系。在您的设置器中,您必须传递一个实体或该实体的引用(google $EM->getReference(…))。只有这样,学说才能自动实现相关的实体。
如果只存储相关对象的ID,则每次都必须手动获取实体,因为Doctrine甚至不知道实体之间的关系。
https://stackoverflow.com/questions/25511907
复制相似问题