Symfony3 相关实体在创建时未映射回父级
Symfony3 Related Entity not mapped back to parent on creation
我有 2 个实体 Client
和 Address
具有 OneToMany
关系。
当我创建一个带有地址的新客户端时,它会同时保存客户端和地址,但不会在地址上设置 client_id
,它是 NULL
.
我正在使用 fosrestbundle
和 jmsserializer
并将数据作为 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 = 12345
的 address
,但是字段 client_id
是 NULL
我的实体映射如下:
//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,但我能够获取/设置数据。
我猜 setting
与 serializer->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;
似乎正在工作!
我有 2 个实体 Client
和 Address
具有 OneToMany
关系。
当我创建一个带有地址的新客户端时,它会同时保存客户端和地址,但不会在地址上设置 client_id
,它是 NULL
.
我正在使用 fosrestbundle
和 jmsserializer
并将数据作为 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 = 12345
的 address
,但是字段 client_id
是 NULL
我的实体映射如下:
//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,但我能够获取/设置数据。
我猜 setting
与 serializer->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;
似乎正在工作!