Вы можете разделить задачу на две.
- Получить все категории (status = 1 и parent_id = 0)
- Получить все подкатегории (status = 1 и parent_id! = 0 and parent.status = 1)
$categories = Category::query()
// 1.
->where(function ($query) {
$query->whereStatus(1)->whereParentId(0);
})
// 2.
->orWhere(function ($query) {
$query
->where('parent_id', '!=', 0)
->whereStatus(1)
->whereHas('parent', function ($query) {
$query->whereStatus(1);
});
})
->get();
Помните, что закрытие PHP работает как ( )
в SQL. Таким образом, приведенное выше читается как:
(parent_id = 0 AND status = 1)
OR
(parent_id != 0 AND status = 1 AND (sub query that does a count > 0))
Они необходимы, поскольку мы используем orWhere
.
Часть, которую вам не хватало, вероятно, была whereHas
. Это позволяет вам запросить отношение. В моем примере выше я предполагаю, что обратное отношение belongsTo
установлено в вашей модели Category
как parent()
.