![](/img/trans.png)
[英]Sqlite platform does not support alter foreign key ( Symfony, doctrine migration )
[英]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.