Symfony4 Доктрина Ассоциации вставки - PullRequest
0 голосов
/ 29 ноября 2018

Я получаю данные XML с внешнего мыльного сервера, анализирую данные и создаю объект.Затем я хочу сохранить его в базе данных, но он не работает.

Идентификатор компании, я получаю из внешнего мыла и уникальное значение его строки, например 387sdfh899ohkadkfh8.

Company

/**
 * @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\Entity
 */
class Address
{
    // ...

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Company",inversedBy="adresses")
     * @ORM\JoinColumn(nullable=false)
     */
    private $company;

    // ...
}

CompanyController

class CompanyController
{
    // ...

    $json = $serializer->serialize($data, 'json');
    $obj = $serializer->deserialize($json, 'array<App\Entity\Company>', 'json');     

    // ...
}

Все выглядит так, как ожидалось.Объект был создан, включая два объекта Address.

Обновление - начало

Это структура, которую я получаю при десериализации

array:1 [
  0 => Company {#524
    -id: "0946346d06ffe3f551a80700c2a5c534"
    // ..
    -addresses: ArrayCollection {#538
      -elements: array:2 [
        0 => Address {#1017
          -id: null
            // ...
          -company: null
        }
        1 => Address {#537
          -id: null
              // ..
          -company: null
        }
      ]
    }
    -status: "Active"
  }
]

Обновление - конец

Нокогда я пытаюсь сохранить его в базе данных:

CompanyController

class CompanyController
{
    // ...

    $em= $this->getDoctrine()->getManager();
    foreach ($obj as $o) $em->persist($o);
    $em->flush();

    // ...
}

Я получаю ошибку

вставка адреса невключить идентификатор компании.Для company_id задано значение null

Подобные данные json, включая адреса, соответствующие компании, которые я получу от клиента в формате json, анализируют их через FormType и сохраняют в базе данных, но я не могу управлятьс: /

Как правильно вставить эти связанные объекты?

1 Ответ

0 голосов
/ 30 ноября 2018

Хорошо, я решил проблему

Компания

   /**
     * @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 Спасибо за предложение, оно мне очень помогло.

...