Есть ли способ указать значение внешнего ключа без какой-либо ссылки на объект сущности или репозитории в Doctrine

#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);