Doctrine возвращает пустую коллекцию для отношений ManyToMany, когда используется аннотация indexBy - PullRequest
0 голосов
/ 27 марта 2020

У меня здесь Doctrine Модели стран и прогнозов. Многие прогнозы могут иметь много стран. Я пытаюсь проиндексировать коллекцию стран по идентификатору страны, как объяснено здесь : Вы можете отобразить индексированные ассоциации, добавив атрибут «indexBy» к любой аннотации @OneToMany или @ManyToMany, однако при добавлении атрибута «indexBy» ArrayCollection стран становится пустым. Имейте добавление атрибута indexBy с отношением @OneToMany, и он работает нормально, вы получаете ArrayCollection, проиндексированный по указанному столбцу.

Если я изменю @ORM \ ManyToMany (targetEntity = "Country", indexBy = "country_id") на @ORM \ ManyToMany (targetEntity = "Country", indexBy = "forecast_id") ArrayCollection возвращается и работает нормально Тем не менее, я хочу, чтобы страны проиндексированы по идентификатору страны. Что мне здесь не хватает?

Модель страны

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repositories\CountryRepository")
 * @ORM\Table(name="countries",uniqueConstraints={
 *     @ORM\UniqueConstraint(
 *          name="countries_idx",
 *          columns={"code"}
 *     )
 * })
 */

class Country
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @ORM\Column(type="string")
     */
    private $name;
    /**
     * @ORM\Column(type="string", unique=true)
     */
    private $code;

    public function __construct()
    {

    }

     /**
     * @return mixed
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @return mixed
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * @param mixed $name
     */
    public function setName($name): void
    {
        $this->name = $name;
    }

    /**
     * @return mixed
     */
    public function getCode()
    {
        return $this->code;
    }

    /**
     * @param mixed $code
     */
    public function setCode($code): void
    {
        $this->code = $code;
    }
   }

Модель прогноза

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repositories\ForecastRepository")
 * @ORM\Table(name="forecasts")
 */
class Forecast
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     */
    private $id;
    /**
     * @ORM\Column(type="string",nullable=true)
     */
    private $name;

     /**
     * Many Forecasts have Many Countries.
     * @ORM\ManyToMany(targetEntity="Country", indexBy="country_id")
     * @ORM\JoinTable(name="forecast_countries",
     *      joinColumns={@ORM\JoinColumn(name="forecast_id", referencedColumnName="id", onDelete="CASCADE")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="country_id", referencedColumnName="id", onDelete="CASCADE")})
     * @var ArrayCollection|Country[]
     *
     */
    private $countries

     public function __construct()
    {
        $this->countries = new ArrayCollection();
    }

        /**
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @return mixed
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * @param mixed $name
     */
    public function setName($name): void
    {
        $this->name = $name;
    }

     /**
     * @return ArrayCollection|Country[]
     */
    public function getCountries()
    {
        return $this->countries;
    }
}
...