2013-12-17 5 views
1

Рассмотрит следующий сценарий в Laravel 4.1Laravel отношение: hasMany различных классов

  • есть модель Set, которая может иметь много элементов (отсортированный по старшинству, но это может быть отложено на данный момент)
  • каждый из этих элементов может быть различной «рода» (думать о сумке (набор), который содержит ключи, бумажник, CIGS ...)

в идеале я хотел бы добиться следующего:

  • имеет упрощенное, желая загружаемое отношение между набором и его элементами (объяснено лучше ниже)
  • держать модели записей СУХИМИ (в идеале каждый элемент расширяет абстрактный класс с базовым кодом шаблонного)

Чтобы лучше проиллюстрировать, что я имею в виду:

class Set extends Eloquent { 
    // ... 
    public function items() { 
     // provides a "transparent" method to access ALL of its items ... no matter what class 
    } 
} 

и

class SubItemOne extends Item { // ... } 
class SubItemTwo extends Item { // ... } 

abstract class Item extends Eloquent { 
    public function set() { 
     return $this->belongsTo('Set'); 
    } 
} 

потому что по своему ядру каждый подкласс имеет много общего с другими (подумайте: все они могут быть перемещены в комплекте, или они могут быть прикреплены к изображению и т. Д. ... все это может быть определенные в абстрактном классе Item).

По сути, я хочу, чтобы иметь возможность получить доступ ко всем пункты, относящихся к моему Набору в ситуациях, как

Set::with('items')->find(1); 

, но я действительно не уверен, какие отношения использовать для «обратного».

Вещи Я считал до сих пор:

  • вынимают подклассы моделей и просто держать одну модель предмета с «item_kind» флаг, чтобы определить его тип. Каждый элемент определяет отношение к другому классу, основанное на этом знаке ... (уже звучит для меня неуклюже)
  • Полиморфные отношения (включая новый N-2-N, введенный в L 4.1) t действительно кажется, что думают об этом конкретном сценарии: особенно N2N все еще не решает проблему доступа ко всем элементам через одно простое отношение.
  • Откажитесь от загружаемого с нетерпением отношения и напишите пользовательский метод get_items(), который доступ к отдельным отношениям (как в -> subitemones(), -> subitemtwos() и т. д.), но это кажется довольно глупым способом решить эту проблему (я действительно хотел бы иметь возможность доступа к отношениям в построителе запросов)

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

ответ

0

Вы могли бы сосредоточиться на своем иерархическом стиле для иерархии DB. Существует множество способов представления наследования в вашей схеме БД.

Учитывая ваш сценарий вы можете иметь следующие таблицы:

  • Set: Этот объект отображает свой родительский класс и хранит всю общую информацию о Устанавливаемом (например, установке и т.д.)
  • SubItemOne: Расширяет " set "и сохраняет только дополнительную информацию, относящуюся к этому типу.
  • SubitemTwo ... и т.д.

SubItemXXX есть 1: 1 отношения с Set объекта. Все, что вам нужно сделать, это просто РЕГИСТРИРУЙТЕСЬ слиться SubItemXXX и Набор

Вы можете прочитать по адресу: How can you represent inheritance in a database?

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