我的表格如下: 结构 - > 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 %}
我该如何解决?
我需要更改数据库结构吗?
答案 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 %}