Рассмотрит следующий сценарий в 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() и т. д.), но это кажется довольно глупым способом решить эту проблему (я действительно хотел бы иметь возможность доступа к отношениям в построителе запросов)
Я как бы застрял здесь, но я не могу поверить, что я единственный, кто стоит перед этой ситуацией ... Я действительно надеюсь на предложение «лучшей практики» здесь!