2017-01-18 7 views
2

У меня есть полиморфная модель изображения (public $morphTo = ['imageable' => []];) и модель Post, которая ее использует.OctoberCMS Множество морфовых отношений

Я хочу Сообщение иметь 2 O 3 изображений для самого различных целей (сообщение заголовка, Показанных изображений и фонового изображения)

Из-за сложности изображения модели обработки изображений и его использование на несколько других классах (Статьи , Страницы и т. Д.) Я бы очень хотел использовать его в таких сообщениях, но один образ каждого типа, поэтому я использую morphOne. Сделал так, как это на Post Модель:

public $morphOne = [ 
    'header_image' => [ 
     Image::class, 
     'name' => 'imageable' 
    ], 
    'featured_image' => [ 
     Image::class, 
     'name' => 'imageable' 
    ], 
    'background_image' => [ 
     Image::class, 
     'name' => 'imageable' 
    ], 
]; 

Но восстановление изображения, кажется, всегда получить первый в таблице изображения, даже будучи как сохранённые там. Сохранение любого заменяет первую запись, удаление удаляет первую запись, и т.д ...

Я думаю, проблему, вероятно, извлечение одного записи для отношений MorphOne получает первое, что соответствует type и id для гарантируемого атрибута.

Вопрос: Есть ли способ сделать эту структуру работой? Параметры отношения, возможно, разные отношения морфинга?

Спасибо за помощь!

+1

никогда не пробовали octobercms (пока - но было несколько Laravel фон) Интересно, что произойдет, если вы дали ему другое имя, '«имя»=>«imageable'' , ** Изменить ** или, возможно, предоставить дополнительную таблицу (если возможно) в таблицу изображений, как [в этом примере] (https://laracasts.com/discuss/channels/general-discussion/multiple-polymorphic-relations- на одной модели). –

+1

Реализовано практически такое же решение на октябрь с использованием условий отношений. См. Мой ответ ниже! –

+1

Я вижу, его интересный способ манипулировать полиморфными отношениями. –

ответ

1

Я нашел способ использовать несколько отношений morphOne.

Вам просто нужно добавить область или условия для отношений и столбца для фильтрации данных:

public function scopeHeaderImage($query) { 
    $query->where('image_type', "header_image"); 
} 

public function scopeFeaturedImage($query) { 
    $query->where('image_type', "featured_image"); 
} 

И на отношениях:

public $morphOne = [ 
    'header_image' => [ 
     \NewCriterion\Content\Models\Image::class, 
     'name' => 'imageable', 
     'scope' => 'headerImage' 
    ], 
    'featured_image' => [ 
     \NewCriterion\Content\Models\Image::class, 
     'name' => 'imageable', 
     'conditions' => "image_type = 'featured_image'" 
    ] 
]; 

Оба способа являются допустимыми, так как (с использованием метода модели сверху или непосредственно с использованием необработанного условия)

Обратите внимание, что для правильной работы вы ust сохранить эту информацию в базе данных. Я, например, реализовать его в $model->beforeFilter():

$model->header_image->image_type = "header_image"; 
$model->featured_image->image_type = "featured_image"; 
Смежные вопросы