我想建立一些使用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;
同样的问题? http://stackoverflow.com/questions/16100623/doctrine2-columns-change-to-null-just-before-flushing – cheesemacfly 2013-04-24 16:50:17
ypu不需要明确定义日志中的siteid与教条的联接将自己做到 – 2013-08-31 22:07:23