Symfony4 Doctrine Associations 插入
Symfony4 Doctrine Associations insert
我从外部 soap 服务器获取 xml 数据,解析数据并创建对象。接下来我想将它保存在数据库中,但它不起作用。
公司 id,我从外部 soap 中获取它的字符串唯一值,如 387sdfh899ohkadkfh8
。
公司
/**
* @ORM\Entity
*/
class Company
{
/**
* @ORM\Id()
* @ORM\GeneratedValue(strategy="NONE")
* @ORM\Column(type="string")
*/
private $id;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Address", mappedBy="company", orphanRemoval=true, cascade={"persist","remove"})
*/
private $addresses;
// ...
}
地址
/**
* @ORM\Entity
*/
class Address
{
// ...
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Company",inversedBy="adresses")
* @ORM\JoinColumn(nullable=false)
*/
private $company;
// ...
}
公司控制人
class CompanyController
{
// ...
$json = $serializer->serialize($data, 'json');
$obj = $serializer->deserialize($json, 'array<App\Entity\Company>', 'json');
// ...
}
一切看起来都符合预期。创建的对象包括两个地址对象。
更新 - 开始
这是我从反序列化中得到的结构
array:1 [
0 => Company {#524
-id: "0946346d06ffe3f551a80700c2a5c534"
// ..
-addresses: ArrayCollection {#538
-elements: array:2 [
0 => Address {#1017
-id: null
// ...
-company: null
}
1 => Address {#537
-id: null
// ..
-company: null
}
]
}
-status: "Active"
}
]
更新 - 结束
但是当我尝试将其存储在数据库中时:
公司控制人
class CompanyController
{
// ...
$em= $this->getDoctrine()->getManager();
foreach ($obj as $o) $em->persist($o);
$em->flush();
// ...
}
我遇到错误
inserting address doesn't include id of company. company_id is setting to null
类似的 json 数据,包括对应于公司的地址,我将从客户端获得 json 格式,通过 FormType 解析它并存储到数据库,但我无法管理:/
我应该如何以正确的方式插入相关对象?
好的,我解决了问题
公司
/**
* @ORM\OneToMany(targetEntity="App\Entity\Address", mappedBy="company", orphanRemoval=true, cascade={"persist","remove"})
* @JMS\Accessor(setter="setAddresses")
*/
private $addresses;
并添加方法:
/**
* @param ArrayCollection $addresses
* @return Company
*/
public function setAddresses(ArrayCollection $addresses): self
{
if ( !$this->addresses instanceof ArrayCollection ){
$this->addresses = new ArrayCollection();
};
foreach ($addresses as $address){
if (!$this->addresses->contains($address)) {
$this->addresses[] = $address;
$address->setCompany($this);
}
}
return $this;
}
我在这个问题上花了两天时间:/ 解决方案非常简单,@malarzm感谢您的建议,它对我帮助很大。
我从外部 soap 服务器获取 xml 数据,解析数据并创建对象。接下来我想将它保存在数据库中,但它不起作用。
公司 id,我从外部 soap 中获取它的字符串唯一值,如 387sdfh899ohkadkfh8
。
公司
/**
* @ORM\Entity
*/
class Company
{
/**
* @ORM\Id()
* @ORM\GeneratedValue(strategy="NONE")
* @ORM\Column(type="string")
*/
private $id;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Address", mappedBy="company", orphanRemoval=true, cascade={"persist","remove"})
*/
private $addresses;
// ...
}
地址
/**
* @ORM\Entity
*/
class Address
{
// ...
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Company",inversedBy="adresses")
* @ORM\JoinColumn(nullable=false)
*/
private $company;
// ...
}
公司控制人
class CompanyController
{
// ...
$json = $serializer->serialize($data, 'json');
$obj = $serializer->deserialize($json, 'array<App\Entity\Company>', 'json');
// ...
}
一切看起来都符合预期。创建的对象包括两个地址对象。
更新 - 开始
这是我从反序列化中得到的结构
array:1 [
0 => Company {#524
-id: "0946346d06ffe3f551a80700c2a5c534"
// ..
-addresses: ArrayCollection {#538
-elements: array:2 [
0 => Address {#1017
-id: null
// ...
-company: null
}
1 => Address {#537
-id: null
// ..
-company: null
}
]
}
-status: "Active"
}
]
更新 - 结束
但是当我尝试将其存储在数据库中时:
公司控制人
class CompanyController
{
// ...
$em= $this->getDoctrine()->getManager();
foreach ($obj as $o) $em->persist($o);
$em->flush();
// ...
}
我遇到错误
inserting address doesn't include id of company. company_id is setting to
null
类似的 json 数据,包括对应于公司的地址,我将从客户端获得 json 格式,通过 FormType 解析它并存储到数据库,但我无法管理:/
我应该如何以正确的方式插入相关对象?
好的,我解决了问题
公司
/**
* @ORM\OneToMany(targetEntity="App\Entity\Address", mappedBy="company", orphanRemoval=true, cascade={"persist","remove"})
* @JMS\Accessor(setter="setAddresses")
*/
private $addresses;
并添加方法:
/**
* @param ArrayCollection $addresses
* @return Company
*/
public function setAddresses(ArrayCollection $addresses): self
{
if ( !$this->addresses instanceof ArrayCollection ){
$this->addresses = new ArrayCollection();
};
foreach ($addresses as $address){
if (!$this->addresses->contains($address)) {
$this->addresses[] = $address;
$address->setCompany($this);
}
}
return $this;
}
我在这个问题上花了两天时间:/ 解决方案非常简单,@malarzm感谢您的建议,它对我帮助很大。