【问题标题】:FOSRESTBundle - How to create a new entity and use an existing one in ManyToOne relationship?FOSRESTBundle - 如何在多对一关系中创建新实体并使用现有实体?
【发布时间】: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


    【解决方案1】:

    您需要确保用户实体在实体管理器中进行管理,方法是获取它或使用 $em->merge() 方法获取由实体管理器管理的实例

    【讨论】:

    • 感谢您的回答。因此,我意识到我的情况最好的选择是使用 Symfony Forms。
    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 2013-10-18
    • 2011-01-08
    • 2015-09-25
    • 2018-06-12
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    相关资源
    最近更新 更多