Доктрина: новая сущность была найдена через отношения
Я знаю, это известная проблема, но я не знаю, как решить ее в моем частном случае. У меня есть следующий класс:
class Offer extends ModelEntity
{
/**
* Primary Key.
*
* @var int
*
* @ORMId
* @ORMColumn(name="id", type="integer", nullable=false)
* @ORMGeneratedValue(strategy="IDENTITY")
*/
protected $id;
/**
* @var Provider
*
* @ORMManyToOne(targetEntity="DashboardModelsProvider")
* @ORMJoinColumn(name="provider_id", referencedColumnName="id", nullable=false)
*/
protected $provider;
/**
* @var Article
*
* @ORMOneToOne(targetEntity="ShopwareModelsArticleArticle", cascade={"persist", "remove"})
* @ORMJoinColumn(name="article_id", referencedColumnName="id", nullable=false)
*/
protected $article;
/**
* @var ArrayCollection
*
* @ORMOneToMany(targetEntity="DashboardModelsAppointment", mappedBy="offer", cascade={"persist", "remove"})
*/
protected $appointments;
...
}
Это моя текущая функция для создания объекта предложения:
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, я получил "новая сущность была найдена через отношение 'DashboardModelsOffer#provider' ..." ошибка. С merge это работает. Но теперь я хочу создать встречи для предложения. Я попробовал это как это:
...
$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();
...
Но с этим я получаю "новая сущность была найдена через отношение 'DashboardModelsAppointment#offer'..." и я также попробовал это с помощью merge и со сбором всех встреч в коллекции ArrayCollection, а затем с помощью $offer - > setAppointments ($appointments), но это не сработало. Может кто-нибудь помочь мне с этим? Каков правильный путь? В конце вот класс назначения:
class Appointment extends ModelEntity
{
/**
* Primary Key.
*
* @var int
*
* @ORMId
* @ORMColumn(name="id", type="integer", nullable=false)
* @ORMGeneratedValue(strategy="IDENTITY")
*/
protected $id;
/**
* @var Offer
*
* @ORMManyToOne(targetEntity="DashboardModelsOffer", inversedBy="appointments")
* @ORMJoinColumn(name="offer_id", referencedColumnName="id", nullable=false)
*/
protected $offer;
...
}
1 ответ:
Я думаю, что проблема может быть
Offer->provider
, которая не настроена на автоматическое сохранение, когда вы сохраняете экземплярOffer
с помощью cascade.Поэтому я, вероятно, установил бы каскад persist на нем
/** * @var Provider * * @ORM\ManyToOne(targetEntity="Dashboard\Models\Provider", cascade={"persist"}) * @ORM\JoinColumn(name="provider_id", referencedColumnName="id", nullable=false) */ protected $provider;
Или сохранить его явно в коде
$entityManager->persist($provider);