Поскольку у вас есть отношения один ко многим, вам нужно будет объединиться. Мне проще пойти по другому пути, то есть сгруппировать все товары по их типу и порядку по минимальной цене.
$types = Product::with('type')->groupBy('type_id')
->select('type_id', \DB::raw('MIN(price) as minPrice'))
->orderBy('minPrice')
->get()
->pluck('type');
Это предполагает, что у вас есть отношение типа, определенное в продукте с именем «тип».
Я полагаю, что Вы хотите сделать поиск для определения выполнения к обходу интерфейсом.
Поэтому, возможно, добавьте интерфейс "IWalkable", который выставляет информацию, должен был сделать обход, затем можно создать проверку метода, чтобы видеть, реализует ли переданный объект интерфейс.
Попробуйте это:
if(start.GetType().GetGenericTypeDefinition() == typeof(CustomerWithChildern<>))
Вы могли переместить метод WalkHierarchy в базовый класс и сделать его виртуальным. Реализация базового класса только обработала бы текущий узел. Для CustomerWithChildern<T>
класс, переопределение сделало бы фактический обход.
Я думаю, что все поражают эту "проблему" при первой работе с универсальными классами.
На Вашу первую проблему намекают в Вашей формулировке вопроса: открытый универсальный тип НЕ является базовым классом к закрытому. Нет никаких отношений OO здесь, вообще. Реальным базовым классом является CustomerBase. "Открытый" универсальный тип похож на полузавершенный класс; определение аргументов типа "закрывает" его, заставляя его завершиться.
В то время как можно сделать:
Type t = typeof(CustomerWithChildern<>)
условие
typeof(CustomerWithChildern<>).IsAssignableFrom(CustomerWithChildern<Foo>)
всегда будет Ложь.
- Oisin
И "Как" только работа над полностью определенными универсальными типами.
Посмотрите это обсуждение MSDN для деталей включая обходные решения.
Наиболее распространенное обходное решение, которое я видел, должно добавить интерфейс к соединению, которое Ваш CustomerWithChildren мог реализовать и проверить на тот интерфейс.
Явно с тем методом, нет. Однако можно достигнуть той же функциональности с интерфейсом. На самом деле у Вас могла просто быть своя универсальная реализация класса IEnumerable. Также стоит отметить, что Ваш класс должен также иметь "где T: CustomerBase" для обеспечения безопасности типов.