【发布时间】:2014-10-26 11:18:58
【问题描述】:
我有以下代码:
实体:
<?php
class Trigger
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*
* @JMS\Expose
*
*/
private $id;
/**
* @var string Trigger name
*
* @ORM\Column(name="name", type="string", length=255)
* @Assert\NotBlank(message="Name cannot be blank")
*
* @JMS\Expose
*
*/
private $name;
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="triggers")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=false, onDelete="CASCADE")
*
* @JMS\Expose
* @JMS\MaxDepth(1)
* @Assert\NotNull(message="User cannot be null")
*/
private $user;
}
?>
控制器:
<?php
/**
* @param Trigger $trigger
* @param Request $request
* @return mixed|\Symfony\Component\HttpFoundation\Response
* @FosView(serializerEnableMaxDepthChecks=true, serializerGroups={"user", "admin"})
* @ApiDoc(
* description="Create a new trigger"
* )
* @ParamConverter("trigger", class="Acme\Bundle\SmsBundle\Entity\Trigger", converter="fos_rest.request_body")
*/
public function addAction(Trigger $trigger, Request $request)
{
return $this->processForm($trigger, $request);
}
private function processForm(Trigger $trigger, Request $request)
{
$statusCode = 204;
if ($trigger->getId() == null)
{
$statusCode = 201;
}
if (sizeof($request->get('validationErrors')) == 0) {
$em = $this->getDoctrine()->getManager();
$em->persist($trigger);
$em->flush();
$response = new Response();
$response->setStatusCode($statusCode);
// set the `Location` header only when creating new resources
if (201 === $statusCode) {
$response->headers->set('Location',
$this->generateUrl(
'acme_secured_api_triggers_get', array('id' => $trigger->getId()),
true // absolute
)
);
}
return $response;
}
return View::create($request->get('validationErrors'), 400);
}
?>
我有以下数据要发布以创建新实体:{"name": "test", "user": {"id": 1}}。
User ID=1确实存在。但我收到以下回复:
通过关系发现了一个新实体 “Acme\Bundle\SmsBundle\Entity\Trigger#user”未配置为 实体的级联持久化操作: Acme\Bundle\SmsBundle\Entity\User@000000006f774479000000004dc4b500。到 解决这个问题:要么显式调用 EntityManager#persist() 这个未知实体或配置级联将这个关联保持在 例如@ManyToOne(..,cascade={"persist"}) 的映射。如果你 无法找出导致问题的实体实施 "Acme\Bundle\SmsBundle\Entity\User#__toString()" 获取线索。
正如所见,Symfony (Doctrine) 没有检测到我使用了现有用户,而是尝试创建一个新用户(但由于没有设置级联持久性而失败)。关于如何克服这个问题有什么想法吗?
【问题讨论】:
标签: php symfony doctrine-orm fosrestbundle