Symfony2,条令多通关系错误

Symfony2,条令多通关系错误,symfony,doctrine-orm,Symfony,Doctrine Orm,我正在尝试使用Symfony2和条令建立一个在某个站点上执行的一些操作的日志。我有2个表、站点和日志。Logs表将包含一个siteid,它是sites表的id列的外键。Logs表可以包含同一站点的多个日志 当我尝试在日志表中插入条目时,我得到的siteid为null错误 这是我的密码: 网站实体: <?php namespace A\SHB\Entity; use Doctrine\ORM\Mapping as ORM; /** * Sites * * @ORM\Table()

我正在尝试使用Symfony2和条令建立一个在某个站点上执行的一些操作的日志。我有2个表、站点和日志。Logs表将包含一个siteid,它是sites表的id列的外键。Logs表可以包含同一站点的多个日志

当我尝试在日志表中插入条目时,我得到的siteid为null错误

这是我的密码:

网站实体:

<?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;
    }
}
现在,当我运行此代码时,出现以下错误:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'siteid' cannot be null"
如果在
$em->persist($log)之前我变量转储
$log
,站点ID在那里。我不确定哪里出了问题,也不知道为什么siteid设置为null

更新1: 我尝试进行以下更改,但仍然得到相同的错误:

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

OneToMany不需要JoinColumn。因此,根据研究报告,它看起来应该是这样的


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

您的结构有问题

从日志实体中删除此项

 /**
 * @var integer
 *
 * @ORM\Column(name="siteid", type="integer")
 */
private $siteid;
然后更换这个零件

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

在您的站点中,将此实体替换为

 /**
 * @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;


然后对这些新的feilds使用适当的setter和getter,即将对象传递给setter函数,对于它们映射到的类(如果您不知道这部分,请在注释中写入,我也会这样做)

同样的问题?ypu不需要在日志中明确定义siteid,如果加入了doctrine,那么他们自己就会这样做。我这样做了,但仍然会得到相同的错误。请参阅问题中的“我的更新”。抱歉,引用了错误注释。我根据文档用一个例子编辑了答案。
 /**
 * @var integer
 *
 * @ORM\Column(name="siteid", type="integer")
 */
private $siteid;
  /**
 * @var Log
 *
 * @ORM\ManyToOne(targetEntity="Sites")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="site_id", referencedColumnName="id")
 * })
 */
private $log;
  /**
 * @var Log
 *
 * @ORM\ManyToOne(targetEntity="Sites" inversedBy="logs")
 */
private $site;
 /**
 * @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;