Symfony3 相关实体在创建时未映射回父级

Symfony3 Related Entity not mapped back to parent on creation

我有 2 个实体 ClientAddress 具有 OneToMany 关系。
当我创建一个带有地址的新客户端时,它会同时保存客户端和地址,但不会在地址上设置 client_id,它是 NULL.

我正在使用 fosrestbundlejmsserializer 并将数据作为 json 对象发送。

在我的控制器中,我有以下内容:

/**
 * @REST\POST("/clients", name="create_client")
 */
public function createClientAction(Request $request)
{
    $serializer = $this->get('jms_serializer');
    $client = $serializer->deserialize($request->getContent(), 'AppBundle\Entity\Client', 'json');

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

    return $this->view($client, 200);
}

这是一个简化的请求负载:

{ "name" : "foo", "addresses" : [ { "zip" : "12345" } ]

在我的数据库中,它创建了一个带有 name = foo 的新 client 以及带有 zip = 12345address,但是字段 client_idNULL

我的实体映射如下:

//Client.php
...
...
/**
 * @ORM\OneToMany(targetEntity="Address", mappedBy="client", cascade={"persist", "remove"})
 */ 
private $addresses;

//Address.php
...
...
/**
 * @ORM\ManyToOne(targetEntity="Client", inversedBy="addresses")
 *
 */
private $client;

更新

我现在更加困惑了,我刚刚意识到我的实体中没有任何 getters/setters,但我能够获取/设置数据。

我猜 settingserializer->deserialize 有关。我的服务中有以下内容:

jms_serializer.object_constructor:
    alias: jms_serializer.doctrine_object_constructor
    public: false

getting与fosrestbundle有关。这是获取路线:

/**
 * @REST\GET("/clients/{client}", name="get_client")
 */
public function getClientAction(Request $request, Client $client)
{
    return $this->view($client, 200);
}

显然我需要 merge 而不是 persist 实体。

我更新了路线:

$em = $this->getDoctrine()->getManager();
$em->merge($client);
$em->flush();

Client 实体:

/**
 * @ORM\OneToMany(targetEntity="Address", mappedBy="client", cascade={"persist", "remove", "merge"})
 */ 
private $addresses;

似乎正在工作!