首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建基于几个唯一键的转换后的Doctrine 2实体

如何创建基于几个唯一键的转换后的Doctrine 2实体
EN

Stack Overflow用户
提问于 2016-11-08 21:52:34
回答 1查看 41关注 0票数 1

我试图在Doctrine 2的场景中实现以下内容:

  • 有些司机在比赛中驾驶车辆。
  • 在这些比赛中,车辆可能会发生意外。

这类似于“船长”中的以下内容:

将导出到基于Doctrine 2注释的实体时,如下所示(Getter和setter被剪短):

Driver.php

代码语言:javascript
复制
<?php
namespace Racing\Entity;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Driver
{
    /**
     * @ORM\Id
     * @ORM\Column(type="bigint")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $Id;

    /**
     * @ORM\Column(type="text", nullable=false)
     */
    private $Name;
}

Vehicle.php

代码语言:javascript
复制
<?php
namespace Racing\Entity;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Vehicle
{
    /**
     * @ORM\Id
     * @ORM\Column(type="bigint")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $Id;

    /**
     * @ORM\Column(type="text", nullable=false)
     */
    private $Name;
}

Race.php

代码语言:javascript
复制
<?php
namespace Racing\Entity;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Race
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $Id;

    /**
     * @ORM\Column(type="text", nullable=false)
     */
    private $Name;
}

Accident.php

代码语言:javascript
复制
<?php
namespace Racing\Entity;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Accident
{
    /**
     * @ORM\Column(type="text", nullable=false)
     */
    private $Description;

    /**
     * @ORM\ManyToOne(targetEntity="Racing\Entity\RacingVehicle")
     * @ORM\JoinColumns({
     *     @ORM\JoinColumn(name="Racing_Vehicle_Driver_Id", referencedColumnName="Driver_Id", nullable=false),
     *     @ORM\JoinColumn(name="Racing_Vehicle_Vehicle_Id", referencedColumnName="Vehicle_Id", nullable=false)
     * })
     */
    private $RacingVehicle;

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Racing\Entity\Race")
     * @ORM\JoinColumn(name="Race_Id", referencedColumnName="Id", nullable=false)
     */
    private $Race;
}

RacingVehicle.php

代码语言:javascript
复制
<?php
namespace Racing\Entity;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class RacingVehicle
{
    /**
     * @ORM\Column(type="integer", nullable=false)
     */
    private $Startnumber;

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Racing\Entity\Driver")
     * @ORM\JoinColumn(name="Driver_Id", referencedColumnName="Id", nullable=false)
     */
    private $Driver;

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Racing\Entity\Vehicle")
     * @ORM\JoinColumn(name="Vehicle_Id", referencedColumnName="Id", nullable=false)
     */
    private $Vehicle;
}

测试示例如下所示:

代码语言:javascript
复制
// Get the entity manager
$sservicelocator = $this->getServiceLocator();
$entitymanager = $sservicelocator->get('doctrine.entitymanager.orm_default');

// Create a driver
$driver = new Driver();
$driver->setName("Michael Schumacher");
$entitymanager->persist($driver);

// Create a vehicle
$vehicle = new Vehicle();
$vehicle->setName("Ferrari");
$entitymanager->persist($vehicle);

// Create a race
$race = new Race();
$race->setName("Monaco");
$entitymanager->persist($race);

// Create a racing vehicle
$racingvehicle = new RacingVehicle();
$racingvehicle->setDriver($driver);
$racingvehicle->setVehicle($vehicle);
$racingvehicle->setStartnumber(42);
$entitymanager->persist($racingvehicle);

// Create an accident
$accident = new Accident();
$accident->setRace($race);
$accident->setRacingVehicle($racingvehicle);
$entitymanager->persist($accident); // <-------------- Error line

// Flush
$entitymanager->flush();

当我试图坚持这个事故的时候,我就会得到这样的错误:

代码语言:javascript
复制
The given entity of type 'Racing\Entity\Accident' (Racing\Entity\Accident@0000000072a5fbd400007f1c433b761e) has no identity/no id values set. It cannot be added to the identity map.

因此,我的问题是:如何创建一个以RacingVehicle和Race为主键的实体(意外),同时真正拥有自己的PHP实体(我可以创建多到多的关系,但在这种情况下,我不会有自己的意外实体)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-09 09:03:22

我认为您可以将DriverVehicle作为ids添加到RacingVehicle中。那么Accident看起来会是这样的:

代码语言:javascript
复制
<?php
namespace Racing\Entity;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Accident
{
    //...

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Racing\Entity\Driver")
     * @ORM\JoinColumn(name="Driver_Id", referencedColumnName="Id", nullable=false)
     */
    private $Driver;

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Racing\Entity\Vehicle")
     * @ORM\JoinColumn(name="Vehicle_Id", referencedColumnName="Id", nullable=false)
     */
    private $Vehicle;

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Racing\Entity\Race")
     * @ORM\JoinColumn(name="Race_Id", referencedColumnName="Id", nullable=false)
     */
    private $Race;

    //...
}

这意味着您将得到一个由三列组成的组合键。现在可以使用Driver_Id列和Vehicle_Id列来解决事故中的RacingVehicle

不确定是否可以直接映射它,因为它可能会导致相互冲突的索引(因为Driver_Id的索引与Driver表中的标识符绑定,Vehicle_Id的索引绑定到Vehicle表中的标识符),但您可以在生命周期事件中向RacingVehicle加载或创建代理。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40497077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档