Я использую следующий метод для создания раскрывающегося списка descriptions
с их соответствующим category
как optgroup. Category
имеет много Descriptions
,
Так что в этом случае мой activeDescriptions
мое отношение внутри меня Category
модель.
public static function descriptions()
{
static::active()
->with('activeDescriptions')
->orderBy('name', 'asc')
->get()
->each(function ($category) use (&$descriptions) {
$descriptions[$category->name] = $category->activeDescriptions->pluck('name', 'id')->sortBy('name')->toArray();
});
return $descriptions;
}
Дело в том, что когда у категории нет описаний, я хочу вообще исключить ее из выпадающего списка. Так что я думал об использовании чего-то вроде:
->each(function ($category) use (&$descriptions) {
if($category->doesnthave('activeDescriptions'))
{
continue;
}
$descriptions[$category->name] = $category->activeDescriptions->pluck('name', 'id')->sortBy('name')->toArray();
});
Но это не работает, очевидно, но я не смог понять, как этого добиться. Так что любые указатели будут оценены.
Вы можете проверить, существуют ли отношения, используя
->has('activeDescriptions')
https://laravel.com/docs/5.7/eloquent-relationships#querying-relationship-existence
Простой ответ, который только что всплыл в моей голове, я мог бы просто добавить следующее к моему запросу:
->has('activeDescriptions')
Может быть:
if (!$category->('activeDescriptions')->count()) {
continue;
}
или же
if (!count($category->('activeDescriptions')) {
continue;
}
Обновить
фильтр может быть лучшим подходом (если не собирается has
или же whereHas
в самом запросе):
$filtered = $categories->filter(function ($category) {
return $category->activeDescriptions->count() === 0;
});