Как использовать findBy($creteria) для двунаправленного сопоставления OneToOne?

Есть два объекта -- Asset и Attachment, сопоставленные в двух направлениях OneToOne. Каждый Asset может иметь 0..1 Asset:

Asset

class Asset
{
    /**
     * @var string @ORM\Column(name="asset_uuid", type="string", length=36, nullable=false)
     *      @ORM\Id
     */
    private $uuid;
    /**
     * @var \MyLib\Model\Entity\Attachment
     * @ORM\OneToOne(targetEntity="MyLib\Model\Entity\Attachment", mappedBy="asset", cascade={"remove", "persist"}, orphanRemoval=true)
     **/
    private $attachment;
    ...
}

Attachment

class Attachment
{
    /**
     * @var string @ORM\Column(name="attachment_uuid", type="string", length=36, nullable=false)
     *      @ORM\Id
     */
    private $uuid;
    /**
     * @var \MyLib\Model\Entity\Asset
     * @ORM\OneToOne(targetEntity="\MyLib\Model\Entity\Asset", inversedBy="attachment", cascade={"persist"})
     * @ORM\JoinColumn(name="attachment_linkassetuuid", referencedColumnName="asset_uuid")
     */
    private $asset;
    ...
}

Теперь я хочу find() и Attachment от Asset.uuid:

class AssetService ...
{
    ...
    private function finAttachmentByAssetUuid($assetUuid)
    {
        $entityManager = $this->getEntityManager();
        $attachmentRepository = $entityManager->getRepository('MyLib\Model\Entity\Attachment');

        $attachment = $attachmentRepository->findBy([
            'attachment_linkassetuuid' => $assetUuid
        ]);

        return $attachment;
    }
    ...
}

Но это не работает и не может работать, поскольку Doctrine ожидает имя атрибута сущности, а не имя столбца таблицы. Ну, но здесь у объекта нет атрибута для столбца внешнего ключа.

Как использовать Doctrine\Common\Persistence#findBy(...) в этом случае? Или, если это невозможно: Как получить Attachment по Asset.uuid в этом конкретном случае другим способом?


person automatix    schedule 25.09.2015    source источник


Ответы (1)


В Doctrine основное внимание уделяется вашим сущностям, а не структуре вашей базы данных. Поэтому, если вы хотите получить связанную сущность, вы получите ее не по внешнему идентификатору, а по связанной сущности. Если вы не хотите, чтобы Doctrine выполняла запрос для этого, вы можете получить ссылку на этот объект:

/** @var EntityManager $em */
$asset = $em->getReference('MyLib\Model\Entity\Asset', $assetId);
$attachement = $asset->getAttachment();

Вы можете прочитать о ссылках в документации внутреннего устройства доктрины:

http://doctrine-orm.readthedocs.org/en/latest/reference/unitofwork.html

person StoryTeller    schedule 28.09.2015