저는 교리 2의 시나리오에서 다음을 구현하려고합니다.
Skipper에서 다음과 같이 보입니다.
Doctrine 2 주석 기반 엔터티로 내보내기하면 다음과 같이 표시됩니다 (Getter 및 setter가 차단됨).
Driver.php
<?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
<?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
<?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
<?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
<?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;
}
테스트 샘플은 다음과 같습니다.
// 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();
사고를 계속하려고하면 다음 오류가 발생합니다.
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 클래스 엔터티를 갖는 자체 엔터티 (사고)를 만들 수있는 방법 (다 대다 관계를 만들 수 있지만이 경우에는 자신의 사고 법인).
나는 당신이 Driver
및 Vehicle
ID를 모두 추가 할 수 있다고 생각합니다 RacingVehicle
. 그러면 다음 Accident
과 같이 보일 것입니다.
<?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
라이프 사이클 이벤트이다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다