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