Laravel Polymorph Attachement

Итак, я выясняю, как создать присоединяемый объект с каркасом laravel, так как они реализуют полиморфные отношения.

Мой сценарий следующий: у меня есть один объект, который мы назовем Attachable-Object. Вы можете прикрепить к нему различные виды объектов, которые мы будем называть Attachement-Object. Например, вы сохранили изображение и хотите прикрепить его к различным рекламным объявлениям, профилям, блогам и т. Д.

Так что в теории должна быть таблица со следующей структурой:

 id | attachable_id | attachable_type | attachment_id | attachable_type | ...
1  |             1 |   advertisement |             1 |           image | ...
1  |             2 |         profile |             1 |           image | ...
1  |             1 |   advertisement |             3 |           video | ...

Эта структура очень расширяемая, поскольку вам не нужно добавлять дополнительные столбцы в другие таблицы или создавать таблицы для отношений «многие ко многим».

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

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

Второй вопрос: Как реализовать это в стиле laravel с полиморфными отношениями? Это вообще возможно?

Я предполагаю, что должна быть Attachment-Model, которая будет реализовывать оба способа следующим образом:

// Attachment Class
...
public function attachable(){
return $this->morphTo();
}
public function attachment(){
return $this->morphTo();
}
...// Advertisement Class
...
public function attachement(){
return $this->morphOne('App\Attachment', 'attachment');
}
...

// Image Class
...
public function attachable(){
return $this->morphOne('App\Attachment', 'attachable');
}
...

Но как правильно это сделать? Надеюсь, кто-то реализовал нечто подобное и может помочь мне в этом.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]