@sonja С этой настройкой у вас будет таблица документов с внешним ключом для агентства, таблица агентств с внешним ключом для рынка и таблица рынков.
я есть форма для создания документов. С одной стороны я могу добавить имена и описания, а рядом я могу выбратьодно или несколько агентств кому принадлежит созданный документ. Каждое из агентств назначено одномуконкретный рынок (всего 7 рынков, поэтому на одном рынке может быть несколько агентств, но одно агентство принадлежит только одному рынку!) Я хочу добиться функции «prePersist», которая автоматически добавляет правильный рынок (рынки) (в зависимости от количество выбранных агентств) к документу.
Моя сущность документа имеет две сущности (рынки и агентства) с соответствующими получателями и установщиками:
/**
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Market", inversedBy="uploadProfiles", cascade={"persist"})
* @ORM\JoinTable(name="document_uploadprofile_markets",
* joinColumns={@ORM\JoinColumn(name="uploadprofile_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="market_id", referencedColumnName="id")})
**/
private $markets;
/**
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Agency", inversedBy="uploadProfiles", cascade={"persist"})
* @ORM\JoinTable(name="document_uploadprofile_agencies",
* joinColumns={@ORM\JoinColumn(name="uploadprofile_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="iata8", referencedColumnName="iata8")})
**/
private $agencies;
public function __construct()
{
$this->agencies = new \Doctrine\Common\Collections\ArrayCollection();
$this->markets = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Add market
*
* @param \AppBundle\Entity\Market $market
*
* @return UploadProfile
*/
public function addMarket(\AppBundle\Entity\Market $market)
{
$this->markets[] = $market;
return $this;
}
/**
* Remove market
*
* @param \AppBundle\Entity\Market $market
*/
public function removeMarket(\AppBundle\Entity\Market $market)
{
$this->markets->removeElement($market);
}
/**
* Get markets
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getMarkets()
{
return $this->markets;
}
/**
* Add agency
*
* @param \AppBundle\Entity\Agency $agency
*
* @return UploadProfile
*/
public function addAgency(\AppBundle\Entity\Agency $agency)
{
$this->agencies[] = $agency;
return $this;
}
/**
* Remove agency
*
* @param \AppBundle\Entity\Agency $agency
*/
public function removeAgency(\AppBundle\Entity\Agency $agency)
{
$this->agencies->removeElement($agency);
}
/**
* Get agencies
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getAgencies()
{
return $this->agencies;
}
Я знаю, что могу добавить функцию prePersist к своей сущности документа и попытаться закодировать то, чего я хочу достичь, но я не думаю, что это работает, потому что мне нужно что-то подобное:
foreach($document->getAgencies() as $agency) {
$document->setMarket($em->getRepository('AppBundle:Agency')->getMarket($agency));
}
Я даже не уверен, что этот цикл foreach правильный, поскольку (пока) результат всегда равен нулю. Я уже задавал вопрос на эту тему здесь:Установщик использования Symfony для Arraycollection в CreateController
Я также пытался написать собственную функцию репозитория, чтобы получить все отличные рынки от моего агентства, но пока что это тоже не работает.
Другой идеей был прослушиватель событий POST_SUBMIT в моем классе формы, но пока это не имело смысла для меня.
Есть идеи? Если нужно больше кода, дайте мне знать!
редактировать Я отредактировал и изменил мой код выше, чтобы иметь много отношений между моими рынками и документами. Затем я попытался добавить функцию prePersist к объекту документа, и она работала нормально, сохраняя при этом связь OneToMany (она всегда перезаписывала предыдущий рынок, но сейчас это не имеет значения). Я сейчас пытаюсь редактировать эта функция позволяет добавить несколько рынков в документ. У меня было две идеи, но обе они не сработали:
if(count($this->getAgencies()) > 0){
foreach($this->getAgencies() as $agency) {
$this->addMarket($agency->getMarket());
}
}
-> Рынок всегда нулевой
или же
if(count($this->getAgencies()) > 0){
$upId = rtrim($this->getId(),"_up");
$query = $em->createQuery("SELECT DISTINCT (a.market) FROM UserBundle\Entity\User u JOIN u.agencies a WHERE u.id = $userId");
$marketIds = $query->getResult();
$em = $this->getDoctrine ()->getManager ();
$repository = $this->getDoctrine()
->getRepository('AppBundle:Market');
$markets = $repository->findOneById($marketIds);
$this->addMarket($markets);
}
}
Обновить
Вот моя предварительная функция в моей сущности документа, а затем функция getMarkets (), которая была предложена в одном из комментариев.Я изменил название на addMarkets вместо getMarkets
/**
* @ORM\PrePersist
*/
public function prePersist() {
if(count($this->getAgencies()) > 0){
foreach($this->getAgencies() as $agency) {
$this->addMarkets($agency->getMarket());
}
}
}
public function addMarkets(\AppBundle\Entity\Market $market)
{
$markets = array();
foreach($this->agencies as $agency) {
$market = $agency->getMarket();
$id = $market->getId();
// Skip duplicates
if (isset($markets['id'])) {
continue;
}
$markets[$id] = $market;
}
return $markets;
}
другой подход
поэтому я снова отредактировал его, теперь моя функция выглядит так
$markets = $this->getMarkets();
if(count($this->getAgencies()) > 0){
foreach($this->getAgencies() as $agency) {
if(!$this->markets->contains($markets)) {
$this->addMarket($agency->getMarket());
}
return;
dump($markets);
}
}
Я подумал, что это может сработать, чтобы удалить мои дубликаты, но это не .. понятия почему?