我正在尝试在 Vehicle 和 job 之间创建一对多关系,如下所示:
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="job")
*/
class Job
{
/**
* @ORM\Column(type="integer", name="id_vehicle")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $idJob;
/**
* @ORM\Column(type="string", length=20, name="delivery_number")
*/
protected $deliveryNo;
/**
* @ORM\Column(type="datetime", name="date_time")
*/
protected $dateTime;
/**
* @ORM\Column(type="string", length=200, name="destination")
*/
protected $destination;
/**
* @ORM\Column(type="integer", name="km_odo_start", nullable=true)
*/
protected $kmOdoStart;
/**
* @ORM\Column(type="integer", name="km_odo_end", nullable=true)
*/
protected $kmOdoEnd;
/**
* @ORM\Column(type="string", length=50, name="deliveryType", nullable=true)
*/
protected $deliveryType;
/**
* @ORM\Column(type="integer", name="fuel_used", nullable=true)
*/
protected $fuelUsedLitre;
/**
* @ORM\Column(type="string", length=100, name="driver_name", nullable=true)
*/
protected $driverName;
/**
* @ORM\Column(type="string", length=250, name="crew_names", nullable=true)
*/
protected $crewNames;
/**
* @ORM\Column(type="string", length=7, name="triler_plate_number", nullable=true)
*/
protected $trilerPlateNumber;
/**
* @ORM\Column(type="string", length=500, name="remarks")
*/
protected $remarks;
/**
* @ORM\Column(type="string", length=500, name="return_load_plan")
*/
protected $returnLoadPlan;
/**
* @ORM\ManyToOne(targetEntity="Vehicle", inversedBy="job")
* @ORM\JoinColumn(name="id_vehicle", referencedColumnName="idVehicle")
*/
protected $idVehicle;
}
还有车辆:
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* @ORM\Entity
* @ORM\Table(name="vehicle")
*/
class Vehicle
{
/**
* @ORM\Column(type="integer", name="id_vehicle")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $idVehicle;
/**
* @ORM\Column(type="string", length=7, name="plate_number")
*/
protected $plateNumber;
/**
* @ORM\Column(type="integer", name="distance_to_service")
*/
protected $DistanceToServiceKm;
/**
* @ORM\Column(type="integer", name="last_service_odo")
*/
protected $lastServiceODOKm;
/**
* @ORM\Column(type="string", length=100, name="make")
*/
protected $makeName;
/**
* @ORM\Column(type="string", length=100, name="model")
*/
protected $modelName;
/**
* @ORM\OneToMany(targetEntity="Job", mappedBy="vehicle")
*/
protected $jobs;
public function __construct()
{
$this->jobs = new ArrayCollection();
}
当我尝试运行时:
PS D:\web\wamp\www\team> php app/console doctrine:schema:update --force
Updating database schema...
[Doctrine\DBAL\DBALException]
An exception occurred while executing 'ALTER TABLE job ADD CONSTRAINT FK_FBD8E0F8C51D4DF6 FOREIGN KEY (id_vehicle)
REFERENCES vehicle (idVehicle)':
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint
[PDOException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint
doctrine:schema:update [--complete] [--dump-sql] [--force] [--em[="..."]]
PS D:\web\wamp\www\team>
然后 --dump-sql
生成良好的 MySQL 代码。
你认为发生了什么?这是一个错误还是我犯了一个错误?我已经看到了一些这样的线程,但是我所看到的所有内容都不适合我。任何帮助将不胜感激。
问候
最佳答案
两个小问题
在作业类中
/**
* @ORM\ManyToOne(targetEntity="Vehicle", inversedBy="jobs")
* @ORM\JoinColumn(name="id_vehicle", referencedColumnName="id_vehicle")
*/
protected $vehicles; //changed the name to different one just for no conflict
在车辆类
/**
* @ORM\OneToMany(targetEntity="Job", mappedBy="vehicles")
*/
protected $jobs;
referencedColumnName应该是相关字段的列名,而不是FieldName;所以它应该是 id_vehicle
。
第二个是在 mappedBy 中,它应该设置为 vehicles
以防万一,通过 phpMyAdmin 或任何其他工具检查您的表结构,并检查是否创建了具有外键的字段尝试删除该字段和外键,然后应用这些更改并运行更新命令
关于php - mysql 数据库的 Symfony2 Doctrine 约束外键问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23085236/