Я знаю, что это известная проблема, но я не знаю, как решить ее в моем частном случае. У меня следующий класс:
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, я получил ошибку «Новый объект был найден через связь« Панель инструментов \ Модели \ Предложение # поставщик »...». Со слиянием работает. Но теперь я хочу назначить встречи для предложения. Я пробовал вот так:
...
$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();
...
Но с этим я получаю «Новый объект был найден через связь« Панель инструментов \ Модели \ Назначение # предложение »...» И я также пробовал это с слиянием и со сбором всех встреч в ArrayCollection, а затем с помощью $ offer-> setAppointments ($ assignments), но это не сработало. Кто-нибудь может мне с этим помочь? Как правильно? В конце находится класс 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);