Задать вопрос

Что такое полиморфные связи?

В интернете есть кое-какая информация, но все в контексте Ruby.
Есть один-к-одному, один-ко-многим, многие-ко-многим. Что за полиморфные связи?
P.S. Использую Laravel. Можно на ее примере.
  • Вопрос задан
  • 10950 просмотров
Подписаться 5 Простой Комментировать
Решения вопроса 2
greabock
@greabock
Могу
Предположим, что у Вас есть комментарий, который может относится к посту(пользователя), а может относится к статье блога.
тогда у Вас таблица может выглядеть примерно так:
comment_id | parent_id | morph| comment_content | author

где:
comment_id - идентификатор самого коммента
parent_id - идентификатор сущности к которой он относится
morph - тип сущности, к которой относится этот комментарий.
comment_content, author - тут я думаю понятно
тогда записи могут выглядеть так:
comment_id | parent_id | morph   | comment_content | author
---------------------------------------------------------------
  1        |   1       | post    | бла бла бла     | vasya
---------------------------------------------------------------
  2        |   1       | article | бла бла бла     | vasya
---------------------------------------------------------------

при чем, несмтря на то, что parent_id у них одинаковый, в первом случае он относится к id в таблице post, а во втором к article
Это и называется полиморфической связью.

пример приведу на фреймворке laravel для php (но ORM там очень схож с Rails, так-что проблем возникнуть не должно)
Модель комментария будет выглядеть приблизительно так:

class Comment extends Eloquent {

 public function morph()
  {
     return $this->morphTo();
  }

}

а модели поста и статьи:

class Post extends Eloquent {

  public function photos()
  {
    return $this->morphMany('post', 'morph');
  }

}

class Article extends Eloquent {

  public function photos()
  {
    return $this->morphMany('article', 'morph');
  }

}

вроде бы ничего не напутал...
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
habrahabr.ru/post/79431 - читаем и осознаем примеры.

По сути это все тоже старое доброе наследование, когда у нас несколько типов записей хранятся в одной таблице и разделаются полем type. Можно в нескольких таблицах хранить и общие поля в базовую таблицу выносить... суть примерно в этом.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
tsarevfs
@tsarevfs
C++ developer
Один из вариантов реализации полиморфизма:
create table Computer(
    id int not null,
    type varchar(20) not null,
    departmentId int not null references Department(id)
)
create table PC(
    id int not null references Computer(id),
    personId int not null references Person(id)
)
create table Notebook(
    id int not null references PC(id),
    dockId references Dock(id)
)


Поддержка такой структуры на чистом SQL может быть достаточно трудоемкой. Скорее всего именно поэтому большинство примеров написаны с использованием различных ORM в том числе на Rubi.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы