Учение / Symfony Присоединение к столам: неожиданное поведение - PullRequest
0 голосов
/ 20 октября 2011

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

foreach ($tracker->getLinkset()->getLinks() as $link) etc..

Более того, код в моем репозитории Tracker выглядит следующим образом:

public function findWithLinks(Tracker $tracker)
{
      $query = $this->createQueryBuilder('t')
                    ->select('t, ls, l')
                    ->innerJoin('t.linkset', 'ls')
                    ->leftJoin('ls.links', 'l')
                    ->where('t.id = :trackerId')
                    ->setParameters(array(
                          'trackerId' => $tracker->getId()
                    ));

      return $query->getQuery()->getResult();
}

То, что я ожидал бы,в контроллере, когда я перебираю таблицу foreach, Symfony не выполняет никаких дополнительных вызовов к базе данных, потому что у меня есть Tracker с присоединенным набором ссылок и присоединенными ссылками.Тем не менее, два дополнительных запроса выполняются, чтобы получить Linkset и ссылки отдельно.Вот сопоставления связанных объектов:

Объект Linkset:

/**
  * @var Link
  *
  * @ORM\ManyToMany(targetEntity="Link", mappedBy="linkset")
  */
  private $links;

Объект Link

/**
  * @var Linkset
  *
  * @ORM\ManyToMany(targetEntity="Linkset", inversedBy="link")
  * @ORM\JoinTable(name="linkcombo",
  *   joinColumns={
  *     @ORM\JoinColumn(name="link_id", referencedColumnName="id", onDelete="CASCADE")
  *   },
  *   inverseJoinColumns={
  *     @ORM\JoinColumn(name="linkset_id", referencedColumnName="id", onDelete="CASCADE")
  *   }
  * )
  */
  private $linkset;

1 Ответ

0 голосов
/ 20 октября 2011

Может быть, вам следует изменить выражение "foreach" на что-то вроде этого?

foreach( $tracker->getLinkset() as $linkset ) {
    foreach( $linkset->getLinks() as $link ) {
        ....
    }
}

Надеюсь, это поможет!

Редактировать :

Если отношение между "linkset" и "link" является просто множественным отношением, я бы изменил аннотации, чтобы они выглядели так:

Сущность linkset :

/**
 * @ORM\ManyToMany(targetEntity="Link")
 **/
private $links;

Объект Link :

/**
 * @ORM\ManyToMany(targetEntity="Linkset")
 */

Это должно работать при условии, что:

  • Объекты Link и Linkset совместно используют одно и то же пространство имен, в противном случае вам следуетизмените targetEntity = "XXX", чтобы он был полностью квалифицирован (т. е. ваш \ Bundle \ Entities \ Linkset и ваш \ OtherBundle \ Entities \ Link
  • Отношение между Tracker и Linkset в порядке (вы это проверяли?)

Я уверен, что кто-то более опытный с symfony2 мог бы помочь вам лучше меня, я недавно начал использовать symfony

...