循环遍历OneToMany - ManyToOne关联

时间:2014-01-24 01:49:12

标签: symfony doctrine-orm symfony-2.3

我的表格如下: 结构 - > OneToMany - >媒体 媒体 - > ManyToOne - > typeMedia

浏览结构必须为每种类型输入媒体。

例如:

照片:

img,img,img,img ..

视频:

视频,视频,视频......

...

我尝试过各种方式,在另一个for循环中使用for循环,但是typeMedia(照片,视频......)会永远复制..

这里是代码,但这是错误的

{% for media in structure.media %}
      {% for type in media.typeMedia.media %}
            <h3>{{ type.typeMedia.name }}</h3>
            <hr/>
            <img src="{{ type.webPath | imagine_filter('thumb', true) }}" />
      {% endfor %}
{% endfor %}

我该如何解决?

我需要更改数据库结构吗?

1 个答案:

答案 0 :(得分:1)

首先,我猜你的twig代码中的type.webPath应该是media.webPath吗?因为webPath是媒体类型的属性没有意义吗?

数据库结构很好。但是,您无法直接关注typeMedia.media关系来获取单个结构的结果。无论您如何导航到typeMedia,typeMedia.media关系将始终为您提供该类型的所有媒体(适用于所有结构)。此外,只要您的外部循环遍历一组媒体,如果媒体集已经按媒体类型排序,则只能通过来自twig的mediaType输出。使用structure.media时默认情况并非如此。

有多种方法可以做到这一点。一种方法是向Structure实体类添加方法以按类型获取媒体。这种方法的优点是,它使您能够从代码中的任何位置(存储库,服务,控制器或树枝)获取结构的类型。例如:

在您的Structure实体类中:

public function getMediaByTypeName()
{
    $mediaByType = array();

    foreach ($this->media as $aMedia)
    {
        $typeName = $aMedia->getTypeMedia()->getName();
        if (!array_key_exists($typeName, $mediaByType)) $mediaByType[$typeName] = array();
        $mediaByType[$typeName][] = $aMedia;
    }

    return $mediaByType;
}

在你的树枝上:

{% for typeName, media in structure.mediaByTypeName %}
    <h3>{{ typeName }}</h3>
    <hr/>
    {% for aMedia in media %}
       <img src="{{ aMedia.webPath | imagine_filter('thumb', true) }}" />
    {% endfor %}
{% endfor %}