Symfony3 - ассоциация относится к полю стороны-владельца, которого не существует с таблицей ManyToMany и fields

я пытаюсь создать отношения manyToMany с большим количеством атрибутов, чем идентификаторы, поэтому мне нужны два отношения OneToMany и два отношения ManytoOne с тремя таблицами/сущностями.

У меня есть объект Product, объект Client и объект ProductClient:

class Client 
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id_client", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $idClient;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=100, nullable=false)
     */
    private $name;

    /**
     * @var \ProductClient
     *
     * @ORM\OneToMany(targetEntity="ProductClient", mappedBy="client")
     */
    private $products_clients;

}

class Product
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id_product", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $idProduct;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=100, nullable=false)
     */
    private $name;

    /**
     * @var \ProductClient
     *
     * @ORM\OneToMany(targetEntity="ProductClient", mappedBy="product")
     */
    private $products_clients;
}

class ProductClient
{

    /**
     * @ORM\Column(name="product_id", type="integer")
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Product", inversedBy="products_clients")
     * @ORM\JoinColumn(name="product_id", referencedColumnName="id_product", nullable=false)
     */
    protected $product;

    /**
     * @ORM\Column(name="client_id", type="integer")
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Client", inversedBy="products_clients")
     * @ORM\JoinColumn(name="client_id", referencedColumnName="id_client", nullable=false)
     */
    protected $client;

    /**
     * @var bool
     *
     * @ORM\Column(name="status", type="boolean")
     */
    private $status;
}

Это что-то вроде этого (с геттерами, сеттерами и другими атрибутами). Но symfony запускает две ошибки недопустимых объектов, когда я перехожу к продукту:

AppBundle\Entity\Product — ассоциация AppBundle\Entity\Product#products_clients относится к полю-владельцу AppBundle\Entity\ProductClient#product, которое определено не как ассоциация, а как поле.

AppBundle\Entity\Product — ассоциация AppBundle\Entity\Product#products_clients относится к несуществующему полю AppBundle\Entity\ProductClient#product стороны-владельца.

И тот же результат, если я захожу в Клиентскую хрень. Что случилось?


person Manuel González Burgueño    schedule 19.02.2019    source источник


Ответы (1)


Как видно из сообщения об ошибке, AppBundle\Entity\ProductClient#product is not defined as association, but as field.

Просто удалите этот @ORM\Column(name="product_id", type="integer") и этот @ORM\Column(name="client_id", type="integer").

class ProductClient
{
    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Product", inversedBy="products_clients")
     * @ORM\JoinColumn(name="product_id", referencedColumnName="id_product", nullable=false)
     */
    protected $product;

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Client", inversedBy="products_clients")
     * @ORM\JoinColumn(name="client_id", referencedColumnName="id_client", nullable=false)
     */
    protected $client;

    /**
     * @var bool
     *
     * @ORM\Column(name="status", type="boolean")
     */
    private $status;
}
person Snegirekk    schedule 19.02.2019
comment
Но с этими двумя строками я бросаю вызов имени полей в mysql. Я не должен это делать? Эта таблица в mysql имеет поля product_id и client_id. - person Manuel González Burgueño; 20.02.2019
comment
@ Мануэль Гонсалес Бургеньо, вы уже определили имена этих полей с помощью аннотаций @ORM\JoinColumn(name="something"), поэтому вам не нужно @Column - person Snegirekk; 20.02.2019