【问题标题】:Symfony 2 Doctrine constrain foreign key issue with the mysql Databasemysql数据库的Symfony2 Doctrine约束外键问题
【发布时间】:2014-04-15 13:31:06
【问题描述】:

我正在尝试在 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 代码。 你认为正在发生什么?我这是一个错误还是我犯了一个错误?我见过一些这样的线程,但我所见过的东西都不适合我。任何帮助将不胜感激。 问候

【问题讨论】:

  • 如果你运行php app/console doctrine:schema:validate它会显示什么?

标签: php mysql sql symfony doctrine-orm


【解决方案1】:

两个小问题

在工作类中

/**
* @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 或任何其他工具检查您的表结构(如果有)并检查是否创建了具有外键的字段尝试删除该字段和外键,然后应用这些更改并运行更新命令

【讨论】:

  • 没问题;所以你可以选择这个作为接受的答案;)
  • 嗨@Javad,我按照你说的方式做了,现在我遇到了另一个问题,系统工作正常,但现在我不能在同一辆车上插入多个作业。我收到此错误:`SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '2' for key 'PRIMARY'` 例如车牌号为 B345TRE 的汽车不能完成 2 项工作。
  • 你能更新你的映射吗?如何插入新记录?你确定你选择了正确的关系类型 ManyToOne?
  • 我要发布一个新主题!和解决这个问题,因为最初的问题已经消失了......
【解决方案2】:

我认为您必须将 Job 实体中的 idVehicle 变量替换为车辆,因为您是在告诉 Vehicle 实体作业映射到车辆(而不是 idVehicle)。

编辑:当另一个答案已经推出时仍在输入,我的错。

edit2:@Benny,我认为referencedColumnName一定是idVehicle而不是id,因为在Vehicle实体中,没有id字段(UID是idVehicle)。

【讨论】:

  • 谢谢@Wcool 和@Benny,变量的名称显然与它无关,像这样我收到同样的东西:/** * @ORM\ManyToOne(targetEntity="Vehicle" , inversedBy="job") * @ORM\JoinColumn(name="id_vehicle", referencedColumnName="idVehicle") */ protected $Vehicle; `id vs idVehicle:我试过id没有识别,因为我没用过,所以应该是idVehicle
【解决方案3】:

您在 Job 类中使用车辆的 ID。使用 Object 本身,教义会自动将其映射到数据库中的 id。

/**
 * @ORM\ManyToOne(targetEntity="Vehicle", inversedBy="job")
 * @ORM\JoinColumn(name="id_vehicle", referencedColumnName="id")
 */
protected $vehicle;

这让 Doctrine 知道该字段中应该有一个“Vehicle”类型的对象,并让 Doctrine 在 Job 表中创建一个列“id_vehicle”,将车辆映射到车辆表的“id”列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 2017-01-14
    • 2013-08-12
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多