#symfony #doctrine-orm
#symfony #doctrine-orm
Вопрос:
У меня есть 2 объекта. Часть и инвентарь
class Part
{
/**
* @ORMId
* @ORMColumn(type="string")
*/
private $partNumber;
/** @ORMColumn(name="part_name", type="string") */
private $partName;
/** @ORMColumn(type="string") */
private $warehouseStatus;
....
Inventory.php
class Inventory
{
/**
* @ORMId
* @ORMColumn(type="integer")
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* One Product has One Shipment.
* @ORMOneToOne(targetEntity="Part")
* @ORMJoinColumn(name="part_number", referencedColumnName="part_number")
*/
private $partNumber;
/** @ORMColumn(type="decimal") */
private $inStock;
Я создаю часть таким образом
class one {
private function method1 {
$part = new Part();
$part->partNumber = 'blabla';
$part->warehouseStatus = 1;
.....
}
class two {
private function method1 {
$inv = new Inventory();
$inv->partNumber = 'blabla'; // it crashes here
$inv->inStock = 1;
.....
}
}
Во втором классе я пытаюсь установить связь с первым объектом, но PartNumber выходит из строя, поскольку он ожидает объект сущности как часть, а не строку. Существует ли интегрированный метод doctrine для создания ссылки на объект part без создания экземпляров репозиториев и так далее.
Комментарии:
1. EntityManager#getReference($EntityName, $identifier) сделает свое дело. Предполагая, что PartNumber является вашим первичным ключом. Но я не думаю, что вы полностью понимаете концепцию отношений доктрины. В инвентаре должна быть часть, а не номер детали.
Ответ №1:
Для этого вам нужно использовать функцию getReference из EntityManager
:
/**
* Gets a reference to the entity identified by the given type and identifier
* without actually loading it, if the entity is not yet loaded.
*
* @param string $entityName The name of the entity type.
* @param mixed $id The entity identifier.
*
* @return object|null The entity reference.
*
* @throws ORMException
*/
public function getReference($entityName, $id);
В вашем случае:
$inv->partNumber = $entityManager->getReference(Part::class, $thePartIdYouReference);