【发布时间】: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