Доктрина: через отношения была найдена новая сущность

Я знаю, что это известная проблема, но я не знаю, как решить ее в моем частном случае. У меня следующий класс:

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;
    ...
} 
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
884
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что проблема может заключаться в 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);

Другие вопросы по теме