@ORM \ ManyToOne (Doctrine пытается заполнить объект вместо значения int в столбце) - PullRequest
0 голосов
/ 04 апреля 2020

Я работаю над формой, использующей ассоциацию @ORM\ManyToOne, но Doctrine продолжает пытаться проанализировать объект аэропорта вместо идентификатора объекта аэропорта, я пробовал несколько аннотаций, таких как @ORM\JoinColumn(name="id", referencedColumnName="id"), но я могу не найдете правильную аннотацию, чтобы doctrine анализировал только идентификатор объекта, а не объекта объекта, любая помощь будет оценена. Также я не ищу быстрое и грязное исправление, я ищу чистый и правильный способ сделать это, используя аннотации Doctrine, если это возможно.

Полное сообщение об ошибке:

An exception occurred while executing 'INSERT INTO flight (from, to) VALUES (?, ?)' with params [{}, {}]:

Notice: Object of class App\Entity\Airport could not be converted to int

Рейс. php

/**
 * @ORM\Entity(repositoryClass="App\Repository\FlightRepository")
 * @ORM\Table(name="flight",
 *      uniqueConstraints={@ORM\UniqueConstraint(name="flight",columns={"from","to"})}
 * )
 */
class Flight
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Airport", inversedBy="outbound")
     * @ORM\JoinColumn(name="id")
     */
    private $from;

    /**
     * @ORM\ManyToOne(targetEntity="Airport", inversedBy="inbound")
     * @ORM\JoinColumn(name="id")
     */
    private $to;

    public function __toString()
    {
      return $this->name;
    }

Аэропорт. php

/**
 * @ORM\Entity(repositoryClass="App\Repository\AirportRepository")
 */
class Airport
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

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

    /**
     * @ORM\Column(type="string", length=200)
     */
    private $region;

    /**
     * @ORM\OneToMany(targetEntity="Flight", mappedBy="to")
     */
    private $inbound;

    /**
     * @ORM\OneToMany(targetEntity="Flight", mappedBy="from")
     */
    private $outbound;

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

Я наконец понял, что проблема была на стороне @ORM\ManyToOne(), пообщавшись с Джакуми:

И что @ORM\JoinColumn() преобразует сущность в int. Он также указал, что from является зарезервированным ключевым словом в MySQL, поэтому я изменил имя столбца на ap_from.

Flight. php

/**
 * @ORM\Entity(repositoryClass="App\Repository\FlightRepository")
 * @ORM\Table(name="flight",
 *      uniqueConstraints={@ORM\UniqueConstraint(name="flight",columns={"ap_from","ap_to"})}
 * )
 */
class Flight
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Airport", inversedBy="outbound")
     * @ORM\JoinColumn(name="ap_from", referencedColumnName="id")
     */
    private $from;

    /**
     * @ORM\ManyToOne(targetEntity="Airport", inversedBy="inbound")
     * @ORM\JoinColumn(name="ap_to", referencedColumnName="id")
     */
    private $to;

    /**
     * @ORM\Column(type="text")
     */
    private $kfm;
0 голосов
/ 05 апреля 2020

Я не вижу смысла помещать аннотацию oneToMany в классе аэропорта или даже атрибуты inbounf и outbound, просто сохраняйте от и до в своем классе полета, тогда вы получаете доступ к любому атрибуту в аэропорту код должен выглядеть так:

Рейс. php:

class Flight{/**
 * @ORM\Id()
 * @ORM\GeneratedValue()
 * @ORM\Column(type="integer")
 */
private $id;

/**
 * @ORM\ManyToOne(targetEntity="Airport")
 * @ORM\JoinColumn(name="airportFrom" , referencedColumnName="id")
 */
private $from;

/**
 * @ORM\ManyToOne(targetEntity="Airport")
 * @ORM\JoinColumn(name="airportTo", referencedCol)
 */
private $to; 

Аэропорт. php

class Airport{

/**
 * @ORM\Id()
 * @ORM\GeneratedValue()
 * @ORM\Column(type="integer")
 */
private $id;

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

/**
 * @ORM\Column(type="string", length=200)
 */
private $region;

и если вы беспокоитесь о том, как получить рейсы, прибывающие или вылетающие из аэропорта, должны выполнить простой запрос sql

...