我正在尝试在车辆和作业之间创建一对多关系,如下所示:
use DoctrineORMMapping as ORM;
/**
* @ORMEntity
* @ORMTable(name="job")
*/
class Job
{
/**
* @ORMColumn(type="integer", name="id_vehicle")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
protected $idJob;
/**
* @ORMColumn(type="string", length=20, name="delivery_number")
*/
protected $deliveryNo;
/**
* @ORMColumn(type="datetime", name="date_time")
*/
protected $dateTime;
/**
* @ORMColumn(type="string", length=200, name="destination")
*/
protected $destination;
/**
* @ORMColumn(type="integer", name="km_odo_start", nullable=true)
*/
protected $kmOdoStart;
/**
* @ORMColumn(type="integer", name="km_odo_end", nullable=true)
*/
protected $kmOdoEnd;
/**
* @ORMColumn(type="string", length=50, name="deliveryType", nullable=true)
*/
protected $deliveryType;
/**
* @ORMColumn(type="integer", name="fuel_used", nullable=true)
*/
protected $fuelUsedLitre;
/**
* @ORMColumn(type="string", length=100, name="driver_name", nullable=true)
*/
protected $driverName;
/**
* @ORMColumn(type="string", length=250, name="crew_names", nullable=true)
*/
protected $crewNames;
/**
* @ORMColumn(type="string", length=7, name="triler_plate_number", nullable=true)
*/
protected $trilerPlateNumber;
/**
* @ORMColumn(type="string", length=500, name="remarks")
*/
protected $remarks;
/**
* @ORMColumn(type="string", length=500, name="return_load_plan")
*/
protected $returnLoadPlan;
/**
* @ORMManyToOne(targetEntity="Vehicle", inversedBy="job")
* @ORMJoinColumn(name="id_vehicle", referencedColumnName="idVehicle")
*/
protected $idVehicle;
}
车辆:
use DoctrineORMMapping as ORM;
use DoctrineCommonCollectionsArrayCollection;
/**
* @ORMEntity
* @ORMTable(name="vehicle")
*/
class Vehicle
{
/**
* @ORMColumn(type="integer", name="id_vehicle")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
protected $idVehicle;
/**
* @ORMColumn(type="string", length=7, name="plate_number")
*/
protected $plateNumber;
/**
* @ORMColumn(type="integer", name="distance_to_service")
*/
protected $DistanceToServiceKm;
/**
* @ORMColumn(type="integer", name="last_service_odo")
*/
protected $lastServiceODOKm;
/**
* @ORMColumn(type="string", length=100, name="make")
*/
protected $makeName;
/**
* @ORMColumn(type="string", length=100, name="model")
*/
protected $modelName;
/**
* @ORMOneToMany(targetEntity="Job", mappedBy="vehicle")
*/
protected $jobs;
public function __construct()
{
$this->jobs = new ArrayCollection();
}
当我尝试运行时:
PS D:webwampwwwteam> php app/console doctrine:schema:update --force
Updating database schema...
[DoctrineDBALDBALException]
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:webwampwwwteam>
然后--dump-sql
生成良好的MySQL代码。你认为发生了什么?我这是一个bug还是我犯了一个错误?我见过一些这样的线索,但我看到的都不适合我。任何帮助都将不胜感激。问候
两个小问题
在作业类中
/**
* @ORMManyToOne(targetEntity="Vehicle", inversedBy="jobs")
* @ORMJoinColumn(name="id_vehicle", referencedColumnName="id_vehicle")
*/
protected $vehicles; //changed the name to different one just for no conflict
在车辆级中
/**
* @ORMOneToMany(targetEntity="Job", mappedBy="vehicles")
*/
protected $jobs;
referencedColumnName应该是相关字段的列名,而不是FieldName;所以它应该是CCD_ 2
第二个是在mappedBy中,它应该设置为属性名称,即vehicles
以防万一,通过phpMyAdmin或任何其他工具检查您的表结构,并检查是否创建了带有外键的字段。尝试删除字段和外键,然后应用这些更改并运行更新命令
我认为您必须将Job实体中的idVehicle变量替换为车辆,因为您告诉vehicle实体作业映射到车辆(而不是idVehicle)。
编辑:当另一个答案已经出来时,我还在打字,我的错。
edit2:@Benny,我认为referencedColumnName必须是idVehicle,而不是id,因为在Vehicle实体中,没有id字段(UID是idVehicle)。
您正在Job类中使用车辆的ID。使用对象本身,条令会自动将其映射到数据库中的id。
/**
* @ORMManyToOne(targetEntity="Vehicle", inversedBy="job")
* @ORMJoinColumn(name="id_vehicle", referencedColumnName="id")
*/
protected $vehicle;
这使条令知道该字段中应该有一个"车辆"类型的对象,并使条令在Job表中创建一个列"id_Vehicle",将车辆映射到车辆表的"id"列。