-2

Symfony2 と Doctrine を使用して、あるサイトで実行されたアクションのログを作成しようとしています。サイトとログの 2 つのテーブルがあります。Logs テーブルには、sites テーブルの id 列への外部キーである siteid が含まれます。ログ テーブルには、同じサイトの複数のログを含めることができます。

ログ テーブルにエントリを挿入しようとすると、siteid is 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;
    }
}

ログ エンティティ:

<?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の前に var_dump を実行する$em->persist($log);と、サイト ID が存在します。何が問題なのか、なぜサイト ID が null に設定されているのかわかりません。

更新 1: 次の変更を加えようとしましたが、同じエラーが発生します。

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

2 に答える 2

0

あなたの構造に問題があり、

これをログ エンティティから削除します

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

そして、これらの新しいフィールドに適切なセッターとゲッターを使用すると、オブジェクトがマップされているクラスのセッター関数にオブジェクトを渡すことを意味します(この部分がコメントに書かれていない場合は、私もそれを行います)

于 2013-08-31T22:01:32.197 に答える