Symfony 3.1 Doctrine实体不能修改表添加外键


Symfony 3.1 Doctrine Entity Cannot alter table add foreign key

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

我的实体分别是"Trips"answers"Airlines",内容如下。我想使用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;
}

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

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

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

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

我有一些建议,因为我经历了相同的设计过程。首先,我是否应该假设"一次旅行只有一家航空公司",以及"一家航空公司有很多次旅行"?这似乎是合乎逻辑的,而且由于您为Trips类显示了@ORM'ManyToOne注释,这将等同于我的相同假设。

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

首先,不要称这些类为"Trips"answers"Airlines",而要用单数形式,即"Trip"answers"Airline"。这就是面向对象的思维。因此,当您创建"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;
    }
}

现在你可以从航空公司获得旅行,也可以反过来,从旅行中获得航空公司。

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