2016-01-30 2 views
1

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

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

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

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

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

The schema as it stands.

В принципе, мне нужно, чтобы быть в состоянии:

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

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

$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); 
+0

Что "не работает"? Вы получаете сообщение об ошибке?Вы получаете один набор данных, но ожидаете другого? Сообщите нам, чего вы ожидаете, что получаете и какие ошибки. – patricus

+0

@patricus Я отредактировал свое сообщение, но прямо сейчас не так много ошибок, как отсутствие интерфейсов, необходимых для правильного выбора данных. Я не уверен, как это реализовать, но я уверен, что концепция является подходящим способом управления этими данными в Eloquent. – Forest

+0

Я обновил это снова, в надежде сделать его более разумным. Общий вопрос касается концепции и техники, поэтому трудно объяснить ошибки. – Forest

ответ

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); 
+0

Это имеет смысл, я попробую. Я просто быстро обновляю свой пост с кодом, который хотел работать, похоже ли это, что это возможно? Если нет, ваше решение должно работать! – Forest

Смежные вопросы