Doctrine orm Symfony4原则协会插入
我从外部soap服务器获取xml数据,解析数据并创建对象。接下来,我想将它持久化到数据库中,但它不起作用 公司id,我从外部soap及其字符串唯一值获取,如Doctrine orm Symfony4原则协会插入,doctrine-orm,associations,symfony4,Doctrine Orm,Associations,Symfony4,我从外部soap服务器获取xml数据,解析数据并创建对象。接下来,我想将它持久化到数据库中,但它不起作用 公司id,我从外部soap及其字符串唯一值获取,如387sdfh899ohkadkfh8 公司 /** * @ORM\Entity */ class Company { /** * @ORM\Id() * @ORM\GeneratedValue(strategy="NONE") * @ORM\Column(type="s
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\OneToMany(targetEntity="App\Entity\Address", mappedBy="company", orphanRemoval=true, cascade={"persist","remove"})
* @JMS\Accessor(setter="setAddresses")
*/
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');
// ...
}
class CompanyController
{
// ...
$em= $this->getDoctrine()->getManager();
foreach ($obj as $o) $em->persist($o);
$em->flush();
// ...
}
更新-结束
但当我尝试将其存储在数据库中时:
公司控制器
class CompanyController
{
// ...
$json = $serializer->serialize($data, 'json');
$obj = $serializer->deserialize($json, 'array<App\Entity\Company>', 'json');
// ...
}
class CompanyController
{
// ...
$em= $this->getDoctrine()->getManager();
foreach ($obj as $o) $em->persist($o);
$em->flush();
// ...
}
我犯了个错误
插入地址不包括公司id。公司id设置为null
类似的json数据,包括我将以json格式从客户端获取的公司地址,通过FormType解析并存储到数据库,但我无法使用:/
如何以正确的方式插入相关对象?好的,我解决了问题 公司
/**
* @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\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感谢您的建议,它对我帮助很大。不确定您使用的是什么反序列化程序,但您确定它正在调用您的
addAddress
/setCompany
方法吗?我使用JMSSerializer,说真的,我不知道它是否调用了addAddress/setCompany
,我也不知道如何检查它。根据你的建议,我添加了@JMS\Accessor(setter=“addAddress”)
,实际上之前没有调用addRes。现在,我得到传递给App\Entity\Company::addAddress()的错误参数1必须是给定的App\Entity\Address、doctor\Common\Collections\ArrayCollection的实例。
。请将您的解决方案作为答案发布,而不是您的解决方案的一部分question@Trix好的,塔克斯。