2014-01-24 6 views
1

У меня есть таблицы следующим образом: структура -> OneToMany -> СМИ СМИ -> ManyToOne -> typeMediaЦикл по OneToMany - ManyToOne ассоциация

просмотр структуры необходимо ввести носитель для каждого типа.

Например:

Фото:

IMG, IMG, IMG, IMG ..

Видео:

видео, видео, видео ...

.. .

Я пробовал во всех отношениях, для цикла внутри другого для цикла, но typeMed Анджелес (фото, видео ..) продублированы навсегда ..

Вот код, но это неправильно

{% 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

Во-первых, я предполагаю, что в вашем сводном коде type.webPath, который должен быть media.webPath? Как не имеет смысла, чтобы webPath был атрибутом типа медиа?

Структура базы данных в порядке. Однако вы не можете напрямую следовать за типом отношенийMedia.media, чтобы получить результаты для одной структуры. Отношение typeMedia.media всегда даст вам все носители этого типа (для всех структур), независимо от того, как вы перешли к типуMedia. Кроме того, до тех пор, пока ваш внешний цикл выполняет итерацию по набору медиафайлов, можно только вывести mediaType из ветки, если этот набор носителей уже упорядочен с помощью mediaType. Это не так по умолчанию при использовании struct.media.

Существуют различные способы, которыми вы могли бы это сделать. Одним из способов было бы добавить метод к вашему классу сущности 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 %} 
+0

Спасибо вам большое! Ты лучший! –

+1

@ user2126724 вы, вероятно, заметили, но я, когда я оглянулся, понял, что сделал пару ошибок, которые я теперь исправил. – redbirdo

Смежные вопросы