簡體   English   中英

Symfony 3.1 Doctrine實體無法更改表添加外鍵

[英]Symfony 3.1 Doctrine Entity Cannot alter table add foreign key

Symfony 3.1-主義 :我試圖在實體之間添加關系,因此想在示例中添加外鍵來鏈接表。 我嘗試了幾種設置,利用了各種參數組合,但沒有一個能夠用外鍵更改表。

我的實體是“ Trips”和“航空公司”,其內容如下。 我想將travel_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;

}

我嘗試從控制台更新架構,但它只說明了

無需更新-您的數據庫已經與當前實體元數據同步。

還嘗試刪除表並使用控制台重新創建它們; 結果沒有太大變化,並且外鍵仍然丟失。 :/

有什么想法,或者您知道解決方案嗎?

我已經提出了一些建議,因為我經歷了相同的設計過程。 首先,我是否應該假設“一次旅行有一家航空公司”以及“一次航空公司有很多航班”? 這似乎是合乎邏輯的,並且由於您為Trips類顯示@ORM \\ ManyToOne批注,因此這與我的假設相同。

如果是這樣,那么建議如下:

首先,不要將類稱為“ Trips”和“ Airlines”,而應使用單數形式,即“ Trip”和“ Airline”。 這是面向對象的思維。 因此,當您創建“旅行”學說對象時,例如,它表示旅行。 從將來的角度來看,這也使您的代碼更具可讀性和支持性。 因為當人們閱讀您的代碼時,他們會理解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\\JoinColumn在同一列中同時使用@ORM\\Column@ORM\\JoinColumn 無需使用@ORM\\Column指定數據類型進行關聯,使用主義進行處理並根據數據庫引擎分配數據類型。 對於MySql,它是int。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM