首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理论2中的ManyToOne关系

理论2中的ManyToOne关系
EN

Stack Overflow用户
提问于 2014-08-26 17:38:05
回答 2查看 101关注 0票数 0

我正在尝试使用2进入Doctrine 2。我有两个数据库表:

广告

  • id
  • advert_title
  • advert_user_id

用户表

  • id
  • 用户名

现在我有了一个表单来添加一个新的广告,当我将广告保存在我的表中时,我想注入advert_user_id。我创建了两个实体:

代码语言:javascript
复制
/** 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; 
}

和下面的用户实体

代码语言:javascript
复制
/**
 * 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;

在我的控制器中,我现在尝试执行以下操作:

代码语言:javascript
复制
if ($form->isValid()) 
{
  $advert->setAdvertUserID('13');  //Static for testing     
  $this->getEntityManager()->persist($advert));
  $this->getEntityManager()->flush();

不幸的是,数据库中的条目始终为空。如果我删除广告实体中的@ORM\ManyToOne $user,它就能工作。设置允许我通过“广告”实体读出用户名,那么为什么我不能在“广告”表中保存用户ID呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-27 07:43:39

据我所知,您的会话中存储了user_id,您希望使用广告保存用户,而不首先从数据库中获取整个用户实体。这听起来是个好主意,只需少执行一个查询。

这样做的方法是:

首先,把你的广告实体从不必要的,而不是按照Doctrine2规范,$advertUserID相关的东西:)

代码语言:javascript
复制
/** 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; 
    }
}

然后通过引用广告添加用户:

代码语言:javascript
复制
$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文档中

票数 0
EN

Stack Overflow用户

发布于 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甚至不知道实体之间的关系。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25511907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档