php - 教义:通过关系发现了一个新实体
问题描述
我知道,这是一个著名的问题,但我不知道如何在我的特殊情况下解决它。我有以下课程:
class Offer extends ModelEntity
{
/**
* Primary Key.
*
* @var int
*
* @ORM\Id
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
protected $id;
/**
* @var Provider
*
* @ORM\ManyToOne(targetEntity="Dashboard\Models\Provider")
* @ORM\JoinColumn(name="provider_id", referencedColumnName="id", nullable=false)
*/
protected $provider;
/**
* @var Article
*
* @ORM\OneToOne(targetEntity="Shopware\Models\Article\Article", cascade={"persist", "remove"})
* @ORM\JoinColumn(name="article_id", referencedColumnName="id", nullable=false)
*/
protected $article;
/**
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="Dashboard\Models\Appointment", mappedBy="offer", cascade={"persist", "remove"})
*/
protected $appointments;
...
}
这是我当前创建 Offer 对象的函数:
public function createOffer(array $data, Provider $provider)
{
// An article object is created here with persist and flush (Not my class and function, so I can't edit it)
$article = $this->resource->create($data);
$offer = new Offer();
$offer->setProvider($provider);
$offer->setArticle($article);
$this->modelManager->merge($offer);
$this->modelManager->flush();
return $offer;
}
我不得不使用合并功能,因为当我使用persist时,我得到了“通过关系'Dashboard\Models\Offer#provider'...找到了一个新实体”错误。随着合并它正在工作。但现在我想为报价创建约会。我试过这样:
...
$offer = new Offer();
$offer->setProvider($provider);
$offer->setArticle($article);
if ($data["appointments"]) {
foreach ($data["appointments"]["dates"] as $i => $date) {
$appointment = new Appointment();
$appointment->setDate(new \DateTime($date));
$appointment->setStreet($data["appointments"]["streets"][$i]);
$appointment->setZipcode($data["appointments"]["zipcodes"][$i]);
$appointment->setCity($data["appointments"]["cities"][$i]);
$appointment->setOffer($offer);
$this->modelManager->persist($appointment);
}
}
$this->modelManager->merge($offer);
$this->modelManager->flush();
...
但是有了这个我得到“通过关系'Dashboard\Models\Appointment#offer'找到了一个新实体......”我还尝试了合并并在ArrayCollection中收集所有约会,然后使用$offer- >setAppointments($appointments),但这都不起作用。有人可以帮我吗?正确的方法是什么?最后是 Appointment 类:
class Appointment extends ModelEntity
{
/**
* Primary Key.
*
* @var int
*
* @ORM\Id
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
protected $id;
/**
* @var Offer
*
* @ORM\ManyToOne(targetEntity="Dashboard\Models\Offer", inversedBy="appointments")
* @ORM\JoinColumn(name="offer_id", referencedColumnName="id", nullable=false)
*/
protected $offer;
...
}
解决方案
我认为问题可能是当您持久化使用级联Offer->provider
的实例时未配置为自动持久化。Offer
因此我可能会设置级联坚持它
/**
* @var Provider
*
* @ORM\ManyToOne(targetEntity="Dashboard\Models\Provider", cascade={"persist"})
* @ORM\JoinColumn(name="provider_id", referencedColumnName="id", nullable=false)
*/
protected $provider;
或在代码中显式保留它
$entityManager->persist($provider);
推荐阅读
- biztalk - BizTalk 架构中的 xs:string 字段元素更改为 Uint16
- c - 如何利用未使用的位来节省内存?
- sql - 动态日期报告
- android - 有没有办法让android studio中的按钮向内半径?
- javascript - nuxt.js 动态组件在页面加载后消失
- wvd - 关于限制 azure wvd 中的复制、粘贴和打印机访问
- python - 如何解决 Google Cloud API 的“如果未提供 http,则必须存在凭据”问题?
- amazon-web-services - AWS:未找到密钥对
- python - 绘制具有不同功能的分岔图
- verilog - casez 语句中“=”附近的 Verilog 语法错误