Laravel Утвержденные категории попадают в одну таблицу - PullRequest
1 голос
/ 09 июля 2020

Laravel версия: 7.0

Это моя categories таблица.

        Schema::create('categories', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('parent_id')->default(0);
            $table->string('name');
            $table->boolean('status')->default(1);
            $table->timestamps();
        });

Есть два уровня категорий. Если parent_id равно 0, то это category, если parent_id не 0, то это subcategory.

Я хочу получить все categories & subcategories, которые имеют status == 1 и если это subcategory, то его parent category's status должно быть 1.

Я сделал Category модель.

$categories = Category::where('status', 1)->get();

Вышеупомянутый запрос может получить подкатегории, которые parent category's status == 0. Как я могу отфильтровать все категории и подкатегории? Кто-нибудь может мне помочь?

1 Ответ

1 голос
/ 09 июля 2020

Вы можете разделить задачу на две.

  1. Получить все категории (status = 1 и parent_id = 0)
  2. Получить все подкатегории (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().

...