@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);
  }
}

Я подумал, что это может сработать, чтобы удалить мои дубликаты, но это не .. понятия почему?

Ответы на вопрос(3)

Ваш ответ на вопрос