2013-04-24 88 views
-2

我想建立一些使用Symfony2和Doctrine在某个网站上执行的操作的日志。我有2个表格站点和日志。日志表将包含一个siteid,它是sites表的id列的外键。日志表可以为同一个站点提供多个日志。Symfony2,doctrine ManyToOne关系错误

当我尝试在日志表中插入一个条目时,我得到了siteid为空的错误。

这里是我的代码:

站点实体:

<?php 

namespace A\SHB\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* Sites 
* 
* @ORM\Table() 
* @ORM\Entity(repositoryClass="A\SHB\Entity\SitesRepository") 
*/ 
class Sites 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var ArrayCollection $siteLog 
    * 
    * @ORM\OneToMany(targetEntity="Logs", mappedBy="log", cascade={"persist"}) 
    * @ORM\OrderBy({"siteid" = "ASC"}) 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="log_id", referencedColumnName="siteid") 
    * }) 
    */ 
    private $siteLog; 

    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Constructor 
    */ 
    public function __construct() 
    { 
     $this->siteLog = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

    /** 
    * Add siteLog 
    * 
    * @param \A\SHB\Entity\SiteLog $siteLog 
    * @return Sites 
    */ 
    public function addSiteLog(\A\SHB\Entity\SiteLog $siteLog) 
    { 
     $this->siteLog[] = $siteLog; 

     return $this; 
    } 

    /** 
    * Remove siteLog 
    * 
    * @param \A\SHB\Entity\SiteLog $siteLog 
    */ 
    public function removeSiteLog(\A\SHB\Entity\SiteLog $siteLog) 
    { 
     $this->siteLog->removeElement($siteLog); 
    } 

    /** 
    * Get siteLog 
    * 
    * @return \Doctrine\Common\Collections\Collection 
    */ 
    public function getSiteLog() 
    { 
     return $this->siteLog; 
    } 
} 

日志实体:

<?php 

namespace A\SHB\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* Logs 
* 
* @ORM\Table() 
* @ORM\Entity(repositoryClass="A\SHB\Entity\LogsRepository") 
*/ 
class Logs 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="siteid", type="integer") 
    */ 
    private $siteid; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="dateline", type="integer") 
    */ 
    private $dateline; 

    /** 
    * @var Log 
    * 
    * @ORM\ManyToOne(targetEntity="Sites") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="site_id", referencedColumnName="id") 
    * }) 
    */ 
    private $log; 

    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Set siteid 
    * 
    * @param integer $siteid 
    * @return Logs 
    */ 
    public function setSiteid($siteid) 
    { 
     $this->siteid = $siteid; 

     return $this; 
    } 

    /** 
    * Get siteid 
    * 
    * @return integer 
    */ 
    public function getSiteid() 
    { 
     return $this->siteid; 
    } 

    /** 
    * Set dateline 
    * 
    * @param integer $dateline 
    * @return Logs 
    */ 
    public function setDateline($dateline) 
    { 
     $this->dateline = $dateline; 

     return $this; 
    } 

    /** 
    * Get dateline 
    * 
    * @return integer 
    */ 
    public function getDateline() 
    { 
     return $this->dateline; 
    } 

    /** 
    * Set log 
    * 
    * @param \A\SHB\Entity\Log $log 
    * @return Logs 
    */ 
    public function setLog(\A\SHB\Entity\Log $log = null) 
    { 
     $this->log = $log; 

     return $this; 
    } 

    /** 
    * Get log 
    * 
    * @return \A\SHB\Entity\Log 
    */ 
    public function getLog() 
    { 
     return $this->log; 
    } 
} 

控制器:

public function indexAction() 
{ 
    $sites = $this->getDoctrine()->getRepository('ASHB:Sites')->findAll(); 

    foreach ($sites as $site) 
    { 
     $host = $site->getForum(); 
     // Do something .... 

     $log = new Logs(); 
     $log->setSiteid($site->getId()); 
     $log->setDateline($temp['dateline']); 

     $em = $this->getDoctrine()->getManager(); 
     $em->persist($log); 
     $em->flush(); 
    } 
    return $this->render('ASHB:Default:index.html.twig', array('sites' => $output, 'counters' => $counters)); 
} 

现在,当我运行这段代码,我得到以下错误:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'siteid' cannot be null" 

如果我的var_dump $log$em->persist($log);前,SITEID是存在的。我不知道什么是错的,为什么siteid被设置为空。

更新1: 我试着做如下修改,仍然得到了同样的错误:

/** 
* @var Log 
* 
* @ORM\ManyToOne(targetEntity="Sites", inversedBy="siteLog") 
*/ 
private $log; 
+0

同样的问题? http://stackoverflow.com/questions/16100623/doctrine2-columns-change-to-null-just-before-flushing – cheesemacfly 2013-04-24 16:50:17

+0

ypu不需要明确定义日志中的siteid与教条的联接将自己做到 – 2013-08-31 22:07:23

回答

0

一对多不需要JoinColumn。所以它应该看起来像,根据documentation

class Sites 
{ 
    /** 
    * @ORM\OneToMany(targetEntity="Logs", mappedBy="log") 
    */ 
    private $site_log; 
} 

class Logs 
{ 
    /** 
    * @ORM\ManyToOne(targetEntity="Sites", inversedBy="site_log") 
    * @ORM\JoinColumn(name="site_id", referencedColumnName="id") 
    */ 
    private $log; 
} 

orderBy和cascade被忽略,为简单起见。

+0

我做到了并仍然得到相同的错误。在问题中查看我的更新。 – Virendra 2013-04-24 17:01:08

+0

对不起,引用了false注解。我根据文档编辑了一个例子的答案。 – 2013-04-25 09:12:28

0

你在你的内在张力结构的问题,

从日志实体删除此

/** 
* @var integer 
* 
* @ORM\Column(name="siteid", type="integer") 
*/ 
private $siteid; 

然后用

/** 
* @var Log 
* 
* @ORM\ManyToOne(targetEntity="Sites" inversedBy="logs") 
*/ 
private $site; 

而且在更换这部分

/** 
* @var Log 
* 
* @ORM\ManyToOne(targetEntity="Sites") 
* @ORM\JoinColumns({ 
* @ORM\JoinColumn(name="site_id", referencedColumnName="id") 
* }) 
*/ 
private $log; 

您SI TES实体

/** 
* @var ArrayCollection $siteLog 
* 
* @ORM\OneToMany(targetEntity="Logs", mappedBy="logs", cascade={"persist"}) 
* @ORM\OrderBy({"siteid" = "ASC"}) 
* @ORM\JoinColumns({ 
* @ORM\JoinColumn(name="log_id", referencedColumnName="siteid") 
* }) 
*/ 
private $logs; 

/** 
* @var ArrayCollection $siteLog 
* 
* @ORM\OneToMany(targetEntity="Logs", mappedBy="site", cascade={"persist"}) 
* @ORM\OrderBy({"siteid" = "ASC"}) 
* @ORM\JoinColumns({ 
* @ORM\JoinColumn(name="log_id", referencedColumnName="id") 
* }) 
*/ 
private $logs; 

代替这一点,然后用适当的getter和setter方法为这些新的精密组件意味着传递对象setter函数,因为他们被映射为类(如果你不知道这部分写在评论中我会这样做)