Symfony agrega datos al objeto en pre persistir

Tengo un formulario para crear documentos. Por un lado, puedo agregar nombres y descripciones y al lado puedo seleccionaruna o varias agencias a quien pertenece el documento creado. Cada una de las agencias está asignada a unaespecífico mercado (hay 7 mercados en total, por lo que un mercado puede tener varias agencias, ¡pero una agencia pertenece solo a un mercado!) Lo que quiero lograr es una función "prepersonal" que agrega automáticamente los mercados correctos (dependiendo del número de agencias seleccionadas) al documento.

Mi entidad de documento tiene las dos entidades (mercados y agencias) con los captadores y establecedores correspondientes:

 /**
* @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;
    }

Sé que puedo agregar la función prePersist a mi entidad de documento e intentar codificar lo que quiero lograr, pero no creo que funcione porque necesito algo así:

  foreach($document->getAgencies() as $agency) {
      $document->setMarket($em->getRepository('AppBundle:Agency')->getMarket($agency));
     }

Ni siquiera estoy seguro de si ese bucle foreach es correcto ya que (hasta ahora) el resultado siempre es nulo. Ya he hecho una pregunta sobre ese tema aquí:Symfony usa setter para Arraycollection en CreateController

También intenté escribir una función de repositorio propia para obtener todos los mercados distintos de la entidad de mi agencia, pero hasta ahora tampoco funciona.

Otra idea era un detector de eventos POST_SUBMIT en mi clase de formulario, pero hasta ahora eso tampoco tenía sentido para mí.

¿Algunas ideas? Si se necesita más código, ¡hágamelo saber!

editar Edité y cambié mi código anterior para tener una relación entre muchos mercados y documentos. Lo que luego intenté es agregar la función prePersist a mi entidad de documento y en realidad funcionó bien mientras mantenía la relación OneToMany (siempre sobrescribía el mercado anterior, pero eso no importa ahora) Ahora estoy tratando de editar esa función para que se puedan agregar varios mercados al documento. Dos ideas que tuve, pero ambas no funcionaron:

if(count($this->getAgencies()) > 0){
      foreach($this->getAgencies() as $agency) {
        $this->addMarket($agency->getMarket());
      }
}

-> el mercado siempre es nulo

o

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

actualizar

Aquí está mi función prepersist dentro de mi entidad de documento y luego la función getMarkets (), que se ha sugerido en uno de los comentarios.Cambié el nombre a addMarkets en lugar de 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;
  }

otro enfoque

así que lo edité nuevamente, ahora mi función se ve así

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

Pensé que esto podría funcionar para eliminar mis duplicados, pero no ... ¿alguna idea de por qué?

Respuestas a la pregunta(3)

Su respuesta a la pregunta