Использование Eloquent полиморфных отношений для классификации данных в Laravel

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

Категория создается для использования службами или статьями. Например, если таблица определена как таблица служб, она не будет отображаться как возможная категория для добавления статей.

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

Например, категория услуг может использоваться для многих услуг. Точно так же услуга может иметь много категорий — но только категории услуг.

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

Схема как есть.

По сути, мне нужно уметь:

  • Получить список всех категорий, которые можно использовать по услугам (возможно, where('categorizable_type', 'App\Service')?)
  • Получить список всех категорий, используемых по статьям (возможно where('categorizable_type', 'App\Article')?)
  • Получить список всех статей / услуг в категории
  • Получить список всех категорий, используемых статьей / услугой

В этой идеальной ситуации я также могу легко добавлять новые (или существующие) статьи / услуги в категории:

$category = App\Category::find(1);
$article = new App\Article();
$article->title = 'This is an article title.';
$category->articles()->save($article);

И я могу легко добавить новые (или существующие) категории к статьям / услугам:

$article = App\Article::find(1);
$category = new App\Category();
$category->title = 'This is a category title.';
$article->categories()->save($category);

1

Решение

Хорошо, ваша база данных и ваши определения моделей выглядят хорошо, так же как и ваш код для добавления категории в статью. Тем не менее, ваш код для добавления статьи в категорию немного не в порядке.

Во-первых, нет $category->articles() метод. Чтобы получить доступ к связанным объектам, вы используете определенные отношения: $category->categorizable(), Кроме того, атрибут отношения, $category->categorizable будет содержать загруженный связанный объект, и он автоматически будет Article или Service объект, в зависимости от того, что связано.

Во-вторых, это morphTo() сторона отношений; он ведет себя как belongsTo()и имеет аналогичные методы. Например, нет save() метод, но у вас есть associate() метод. Это означает, что вы должны сначала создать свою статью, а затем связать ее с категорией. Также, associate() не сохраняет автоматически, поэтому вам также нужно это назвать.

$article = new App\Article();
$article->title = 'This is an article title.';
$article->save();

$category = App\Category::find(1);
$category->categorizable()->associate($article);
$category->save();

// showing use of relationship attribute
$related = $category->categorizable;
echo get_class($related);
1

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

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

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