@templton1982

Перестал работать repository, не вызывается конструктор сущности?

Уважаемые Тостеры!
Помоги решить проблему - третий день бьюсь! Начал изучать symfony. Задача такая:

Сущность 1 - sad (id, title)

Сущность 2 - me(id,val)

Связь: для каждой сущности 1 существует множество сущностей 2.

Делаю так:

Сущность 1 - sad
<?php
namespace Stocker\StockBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity(repositoryClass="Stocker\StockBundle\Entity\Repository\SadRepository")
 * @ORM\Table(name="sad")
 */
class Sad
{
    public function __construct()
    {
        $this->mes=new ArrayCollection();
    }
    

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string")
     */
    protected $title;
    
    /**
     * @ORM\OneToMany(targetEntity="Me", mappedBy="Sad")
     */
    private $mes;


Сущность 2 - me
<?php
namespace Stocker\StockBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="Stocker\StockBundle\Entity\Repository\Sad1Repository")
 * @ORM\Table(name="me")
 */
class Me
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string")
     */
    protected $val;
    
    /**
     * @ORM\ManyToOne(targetEntity="Sad", inversedBy="mes")
     * @ORM\JoinColumn(name="sad_id", referencedColumnName="id")
     */
    private $sad;


Репозиторий sadRepository:
<?php

namespace Stocker\StockBundle\Entity\Repository;

/**
 * SadRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class SadRepository extends \Doctrine\ORM\EntityRepository
{
    public function getSad(){
        $qb=$this->createQueryBuilder('f')
                ->select('f');
        return $qb->getQuery()->getResult();
    }
}


Далее:

php app/console doctrine:generate:entities Stocker\StockBundle

Создаются гетеры, сетеры

php app/console doctrine:schema:update --force

Создаются таблицы в БД

Теперь, если в MySQL заполнять таблицу таблицу Me, то связанной поле будет подставлять значение из родительской таблицы выпадющим списком. То есть связи создаются правильно.

Далее в контроллере вызываю нужный репозиторий. В ответ:
array:2 [▼
  0 => Sad {#458 ▼
    #id: 1
    #title: "asdf"
    -mes: PersistentCollection {#475 ▼
      -snapshot: []
      -owner: Sad {#458}
      -association: array:15 [ …15]
      -em: EntityManager {#106 …11}
      -backRefFieldName: "Sad"
      -typeClass: ClassMetadata {#456 …}
      -isDirty: false
      #collection: ArrayCollection {#484 ▼
       <b> -elements: []</b>
      }
     <b> #initialized: false</b>
    }
  }
  1 => Sad {#482 ▶}
]


Проблема: коллекция объектов не создается.

Предистория. Изначально все сделал также, все работало, все хорошо. Начал городить много-ко-многим, создавать промежуточную таблицу и т.д. (Сейчас-то я уже понял, что ORM сама создаст промежуточные таблицы). В итоге этих операций данный алгоритм перестал работать, ссылаясь на #initialized: false

Если в конструкторе Сущности 1 поставить die, то ничего не происходит. То есть явно конструктор сущности вызываться перестал.

Пробовал писать все по-новой, удалять таблицы из БД, создавать новые сущности, удалять и создавать старые. Короче, как бы я не пытался повторить алгоритм, но коллекции все равно не заполняются.
  • Вопрос задан
  • 174 просмотра
Решения вопроса 1
@templton1982 Автор вопроса
Сам спросил, сам и отвечу.
Может кому пригодится.
Все правильно я делал. Только тут использовалась отложенная загрузка.
Запись подгрузится, когда в шаблоне указываешь обращение к ней.
{% for ss in sad %}
            {% for qq in ss.mes %}
                {{qq.val}}
            {% endfor %}
        {% endfor %}


А если надо, чтобы подгружалась не отложенной загрузкой, а сразу, то надо менять запрос в репозитории - добавлять JOIN

5-й урок

public function getSad(){
        $qb=$this->createQueryBuilder('f')
                ->select('f','t')
                ->leftJoin('f.mes', 't');
        return $qb->getQuery()->getResult();
    }


Правда, не понятно, почему изначально такой вариант работал, как полная загрузка.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы