2013-04-24 3 views
-2

Я пытаюсь создать журнал некоторых действий, выполняемых на каком-либо сайте, с использованием Symfony2 и Doctrine. У меня есть 2 таблицы сайтов и журналов. Таблица журналов будет содержать siteid, который является внешним ключом для столбца id таблицы sites. Таблица журналов может иметь несколько журналов для одного и того же сайта.Symfony2, doctrine ManyToOne relationship error

Когда я пытаюсь вставить запись в таблицу журналов, я получаю siteid - ошибка null.

Вот мой код:

Сайты Entity:

<?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; 
    } 
} 

Бревна Entity:

<?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 получает значение null.

Update 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

+0

ypu не нужно явно определять siteid в журналах. Объединяются с доктриной, сделают это сами. –

ответ

0

OneToMany не нужен 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 и каскад были проигнорированы для простоты.

+0

Я сделал это и по-прежнему получают ту же ошибку. См. Мое обновление в вопросе. – Virendra

+0

Извините, ссылка ложная аннотация. Я отредактировал ответ на примере в соответствии с документами. –

0

у вас есть проблемы в вашем sturcture,

Удалить это из журналов Entity

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

И в вашем си 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; 

И затем использовать соответствующие методы установки и получение для этих новых feilds означает передать объект инкубационных функциям, для класса они привязываются к (если вы не знаю эту часть напишите в комментарии, я тоже это сделаю)