【问题标题】:Doctrine2 cascade createDoctrine2 级联创建
【发布时间】:2015-06-16 14:48:53
【问题描述】:

这里有一些上下文信息:我正在使用 Doctrine2 和 FOSRestBundle 构建一个 Symfony2 应用程序。

我的问题:我希望能够通过一个 JSON 和一个数据库访问来创建一个父级和他的子级。

我的 JSON 如下所示:

{
    "name": "TEST_NAME",
    "info": "TEST_INFO",
    "cmts": [
        {
            "cmt": "CMT1",
            "info": "INFO1"
        },
        {
            "cmt": "CMT2",
            "info": "INFO2"
        },
        {
            "cmt": "CMT3",
            "info": "INFO3"
        }
    ]
}

这是我的 TEST 实体:

<?php

namespace App\Bundle\DemoBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Validator\Constraints as Assert;

/**
* Test
*
* @ORM\Table(name="Test")
*    @ORM\Entity(repositoryClass="App\Bundle\DemoBundle\Entity\TestRepository")
*/
class Test
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
     private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     * @Assert\NotBlank()
     */
     private $name;

    /**
     * @var string
     *
     * @ORM\Column(name="info", type="string", length=255, nullable=true)
     */
     private $info;

    /**
     * @ORM\OneToMany(targetEntity="TestCmt", mappedBy="test", fetch="EAGER", orphanRemoval=true, cascade={"merge", "remove", "persist"})
     */
     protected $cmts;

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

    /**
     * Add cmts
     *
     * @param \App\Bundle\DemoBundle\Entity\TestCmt $cmts
     * @return Test
     */
    public function addCmt(\App\Bundle\DemoBundle\Entity\TestCmt $cmts)
    {
        $this->cmts[] = $cmts;

        return $this;
    }

    /**
     * Remove cmts
     *
     * @param \App\Bundle\DemoBundle\Entity\TestCmt $cmts
     */
    public function removeCmt(\App\Bundle\DemoBundle\Entity\TestCmt $cmts)
    {
        $this->cmts->removeElement($cmts);
    }

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

    // other getters/setters...
}

还有我的 TESTCMT 实体:

<?php

namespace App\Bundle\DemoBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * TestCmt
 *
 * @ORM\Table(name="TestCmt")
 * @ORM\Entity(repositoryClass="App\Bundle\DemoBundle\Entity\TestCmtRepository")
 */
class TestCmt
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="cmt", type="string", length=255)
     */
    private $cmt;

    /**
     * @var string
     *
     * @ORM\Column(name="info", type="string", length=255, nullable=true)
     */
    private $info;

    /**
     * @var Test
     *
     * @ORM\ManyToOne(targetEntity="Test", inversedBy="cmts")
     * @ORM\JoinColumn(name="test_id", referencedColumnName="id")
     **/
    private $test;    

    /**
     * Set test
     *
     * @param \App\Bundle\DemoBundle\Entity\Test $test
     * @return TestCmt
     */
    public function setTest(\App\Bundle\DemoBundle\Entity\Test $test = null)
    {
        $this->test = $test;

        return $this;
    }

    /**
     * Get test
     *
     * @return \App\Bundle\DemoBundle\Entity\Test 
     */
    public function getTest()
    {
        return $this->test;
    }
}

最后是我的 postTestAction():

public function postTestAction(Request $request)
{
    $entity = $this->deserialize($request, 'App\DemoBundle\Entity\Test');

    $em = $this->getDoctrine()->getManager();
    $em->persist($entity);
    $em->flush();

    return $entity;
}

当我发送 JSON 时,会创建 TEST 和 TESTCMT。尽管如此,创建的 TESTCMT 中的所有“test_id”都是“null”……这就是我的问题!

编辑:使用 SQL Server Profiler,我可以看到 Doctrine 发出了 Transact SQL 请求:

INSERT INTO TESTCMT (test_id, cmt, info) VALUES (null, 'CMT', 'INFO')

我不知道为什么 Doctrine 不能发送 test_id... TEST 是在 TESTCMT 之前创建的,所以 Doctrine 应该可以访问“test_id”来创建关联的 TESTCMT。

有人可以帮我解决吗? :)

【问题讨论】:

  • 拜托,我真的需要知道如何使用 cascade={"persist", "merge"} 自动给孩子 FK!

标签: symfony doctrine-orm fosrestbundle


【解决方案1】:

删除 @ORM\GeneratedValue(strategy="AUTO") 并且它不会让数据库为实体生成新的 id

【讨论】:

  • 我不能尝试,因为我不再从事这个项目了。不过谢谢你的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多