В моем приложении у меня есть таблица категорий и несколько таблиц, включая сервисы и статьи, которые необходимо классифицировать. Для удобства я хочу использовать полиморфную модель для этих данных.
Категория создается для использования службами или статьями. Например, если таблица определена как таблица служб, она не будет отображаться как возможная категория для добавления статей.
Это также относится к листингу. У меня будет меню для статей и меню для служб, и в каждой из них будут перечислены только категории статей или служб, независимо от того, являются ли они пустыми или содержат ли они соответствующие типы.
Например, категория услуг может использоваться для многих услуг. Точно так же услуга может иметь много категорий — но только категории услуг.
В настоящее время моей базы данных, возможно, недостаточно. Я не использовал сводную таблицу, но когда я пытался ее использовать, она не позволяла мне выбирать только категории статей или категории услуг; на самом деле, между ними вообще не может быть никаких различий.
По сути, мне нужно уметь:
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);
Хорошо, ваша база данных и ваши определения моделей выглядят хорошо, так же как и ваш код для добавления категории в статью. Тем не менее, ваш код для добавления статьи в категорию немного не в порядке.
Во-первых, нет $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);
Других решений пока нет …