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