Symfony 3.1 Doctrine Entity无法改变表添加外键

时间:2016-08-18 00:20:21

标签: php doctrine-orm doctrine symfony

Symfony 3.1 - Doctrine :我试图在实体之间添加关系,从而希望在我的示例中为链接表添加外键。我尝试了几种设置,使用各种参数组合,但没有一个能够使用外键更改表。

我的实体是“旅行”和“航空公司”,内容如下。我想在旅行表中使用 airline_id 作为外键。以下是我的实体脚本的摘录:

实体#1:旅行

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="trips")
 */

class Trips
{

    /**
     * @ORM\Column(name="trip_id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $trip_id;

    /**
     * @ORM\Column(name="airline_id", type="integer")
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Airlines")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="airline_id", referencedColumnName="airline_id")
     * })
     */
    private $airline_id;

}

实体#2:航空公司

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="airlines")
 */

class Airlines
{

    /**
     * @ORM\Column(name="airline_id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $airline_id;

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

}

我尝试从控制台更新架构,但它只是说

  

无需更新 - 您的数据库已与当前实体元数据同步。

还尝试删除表并使用控制台重新创建它们;结果没有太大变化,外键仍然缺失。 :/

有什么想法,或者你知道解决方案吗?

2 个答案:

答案 0 :(得分:1)

我有一些建议,因为我经历了相同的设计过程。 首先,我应该假设“旅行有一家航空公司”,还有“航空公司有多次出行”?这似乎是合乎逻辑的,因为你展示了Trips类的@ORM \ ManyToOne注释,这相当于我的假设。

如果是这样,那么这些是建议:

首先,不要把班级称为“旅行”和“航空公司”,而应该是单数,即“旅行”和“航空公司”。这是面向对象的思想。因此,当您创建“Trip”Doctrine对象时,它代表一次旅行。这也使您的代码更具可读性,并且从未来的角度来看也是可支持的;因为当人们阅读你的代码时,他们会理解一个Trip的单个实例(来自Trip类)代表一个旅行(一个人所采取的)。这在设计代码时很重要。

鉴于上述情况,请对这些代码进行更改。

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="trip")
 */
class Trip
{
    /**
     * @ORM\Id
      * @ORM\Column(name="trip_id", type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $trip_id;

    /**
     * @ORM\ManyToOne(targetEntity="Airline", inversedBy="trips")
     * @ORM\JoinColumn(name="trip_airline_id", referencedColumnName="airline_id")
     */
    private $airline;
     ...
     /**
      * Set airline - Adds this trip to the passed in airline and sets the airline
      * property to resultant airline.
      * 
      * @param \AppBundle\Entity\Airline
      */
     public function setAirline($airline){
         $airline->addTrip($this);
         $this->airline = $airline;
     }
}

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

/**
 * @ORM\Entity
 * @ORM\Table(name="airlines")
 */
class Airlines
{
    /**
     * @ORM\Column(name="airline_id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $airline_id;

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

     /**
      * @ORM\OneToMany(targetEntity="Trip", mappedBy="airline")
      */
     protected $trips = null;
    ... 
     public function __construct(){
        // This is an array of trips.
        $this->trips = new ArrayCollection();
    }
    ...
    /**
     * Add trip - Adds a course to the array.
     */
    public function addTrip($trip){
        $this->trips[] = $trip;
    }
}

现在您可以从航空公司获得旅行,而且您也可以做相反的事情,从旅行中获得航空公司。

答案 1 :(得分:0)

在同一列上指定@ORM\Column@ORM\JoinColumn时,将忽略JoinColumn的关联,并且不会在表上创建外键。所以不要在同一列中同时使用@ORM\Column@ORM\JoinColumn。没有必要为@ORM\Column指定关联的数据类型,doctrine处理它并基于数据库引擎分配数据类型。对于MySql,它是int。