У меня здесь 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;
}
}