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;
}
我尝试从控制台更新架构,但它只是说
无需更新 - 您的数据库已与当前实体元数据同步。
还尝试删除表并使用控制台重新创建它们;结果没有太大变化,外键仍然缺失。 :/
有什么想法,或者你知道解决方案吗?
答案 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。