Доктрина Symfony 2.8. Использование составного первичного ключа и ассоциаций ManyToMany

У меня есть 2 сущности - Платформа и Продукт. В таблице «Продукты» у меня есть составной первичный ключ [идентификатор продукта + идентификатор платформы]. Один продукт может быть представлен на многих платформах, а одна платформа может содержать много продуктов, поэтому ассоциация — ManyToMany.

Сущность платформы:

/**
* Platform
*
* @ORM\Table(name="Platforms")
*/
class Platform
{
/**
 * @var int
 *
 * @ORM\Column(name="Platform_Id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string
 *
 * @ORM\Column(name="Platform_Name", type="string", length=64)
 */
private $name;

/**
* @ORM\ManyToMany(targetEntity="Product", mappedBy="platforms", cascade={"ALL"}, indexBy="numpp")
*/
protected $products;

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

public function addProducts($numpp)
{
    $this->products[$numpp] = new Product($numpp, $this);
}

Сущность продукта:

/**
* Product 
*
* @ORM\Table(name="Products")
*/
class Product
{
/**
 * @var string
 *
 * @ORM\Column(name="Numpp", type="string", length=6)
 * @ORM\Id
 */
private $numpp;

/**
 * @var int
 *
 * @ORM\ManyToMany(targetEntity="Platform", inversedBy="products")
 * @ORM\JoinColumn(name="Platform_Id", referencedColumnName="Platform_Id")
 * @ORM\Id
 */
private $platforms;

public function __construct($numpp, Platform $platform)
{
    $this->numpp = $numpp;
    $this->platforms = new ArrayCollection();
    $this->platforms[] = $platform;
}

В моем контроллере при попытке создать новый объект Product...

$em = $this->getDoctrine()->getManager();
$platform = $em->getRepository("AGAAnalyticsBundle:Platform")->find(1);
$product = new Product('05062', $platform);
$em->persist($product);
$em->flush();

Я получаю сообщение об ошибке: Невозможно вставить значение NULL в столбец "Platform_Id" таблицы "dbo.Products".

И другим способом, используя метод addProduct...

$em = $this->getDoctrine()->getManager();
$platform = $em->getRepository("AGAAnalyticsBundle:Platform")->find(1);
$platform->addProduct('05062');
$em->flush();

Я получаю сообщение об ошибке: Идентификатор столбца должен быть сопоставлен с полем в классе AGA\AnalyticsBundle\Entity\Platform, поскольку на него ссылается столбец соединения другого класса.

Пожалуйста, помогите понять, где я не прав и как мне правильно построить эту связь между моими сущностями.


person Anton Zikov    schedule 01.09.2020    source источник
comment
Если между платформами и производством существует связь «многие ко многим», то нет необходимости в составном ключе, присутствующем в таблице продуктов, вместо этого доктрина будет новой таблицей, которая будет связующей таблицей для вашей платформы и продуктов.   -  person M Khalid Junaid    schedule 01.09.2020
comment
Я думаю, это может помочь Doctrine Query Builder для сущностей с Join Table, Язык запросов Doctrine, запрос с двумя соединениями   -  person M Khalid Junaid    schedule 01.09.2020