В Symfony метод find () возвращает нуль для сущности с однонаправленным отношением один к одному - PullRequest
0 голосов
/ 10 октября 2018

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

Я использую пакет Vich Uploader для храненияКартинки в моем проекте.У меня есть две сущности, связанные с однонаправленным отношением один-к-одному, первая является владельцем и содержит аннотацию, указывающую на вторую сущность, содержащую файл.Это часть кода из первой сущности:

...

     /**
     * @ORM\OneToOne(targetEntity="Cartong\MyBundle\Entity\Mysql\EntityContainingTheFile")
     * @ORM\JoinColumn(name="photo_id", referencedColumnName="id")
     */
    private $photo;

...

И та, которая содержит файл:

 /**
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks()
 * @Vich\Uploadable
 */
class EntityContainingTheFile extends FileUpload
{
    /**
     * @var UploadedFile
     * @Vich\UploadableField(mapping="my_pictures", fileNameProperty="filename")
     */
    protected $file;

    /**
     * @return UploadedFile
     */
    public function getFile()
    {
        return parent::getFile();
    }

    /**
     * @param UploadedFile $file
     */
    public function setFile(File $file)
    {
        return parent::setFile($file);
    }
}

Здесь также есть код FileUpload.Он в основном содержит описание файла (я использую другую сущность, расширяющую этот класс):

 /**
 * @ORM\MappedSuperclass
 * @Vich\Uploadable
 */
class FileUpload
{

    /**
     * @var integer : stock the unique id of the file
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string : stock the format of the file
     *
     * @ORM\Column(name="format", type="string", length=255)
     */
    private $format;

    /**
     * var string : stock the original name of the file
     *
     * @ORM\Column(name="alt", type="string", length=255)
     */
    private $alt;

    /**
     * @var integer : stock the size of the file (ko)
     *
     * @ORM\Column(name="size", type="integer")
     */
    private $size;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="updated_at", type="datetime", nullable=true)
     */
    private $updatedAt;

    /**
     * @var string $filename
     *
     * @ORM\Column(name="filename", type="string", length=255)
     */
    protected $filename;

    protected $file;

Загрузка файла работает хорошо, все хранится в нужном месте в моем проекте и БД.Проблема возникает, когда я пытаюсь получить то, что я просто сохраняю через первый объект.

Это код, который у меня есть в моем контроллере:

$repo = $this->container->get('doctrine')->getRepository('CartongMSFBundle:MyFirstEntity');
        $test = $repo->find($theEntityWithAFile);

Возвращенный объект, содержащий всеОжидаемая информация, кроме фотографии, где все поля нулевые.

Так что, если я пытаюсь получить конкретный файл через findById в репозитории «file», он работает, но когда я пытаюсь получить его через мой первый объект, это не так.

Есть идеи?(может быть ошибка в аннотациях?)

1 Ответ

0 голосов
/ 10 октября 2018

Кажется, это типичная проблема гидратации доктрины.В случае ассоциаций доктрина по умолчанию не загружается из связанных с базой данных объектов до тех пор, пока она не понадобится (например, вы звоните $myFirstEntity->getPhoto()->getFormat()).Это называется отложенной загрузкой.

Если вы хотите, чтобы ваша связанная сущность была загружена вместе с вашей первой сущностью, вы должны установить опцию извлечения доктрины в EAGER:

/**
 * @ORM\OneToOne(targetEntity="EntityContainingTheFile", fetch="EAGER")
 * @ORM\JoinColumn(name="photo_id", referencedColumnName="id")
 */
private $photo;
...