Laravel 批准的类别相同 table

Laravel Approved Categories get in same table

Laravel版本:7.0

这是我的 categories table.

        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_id0,那么就是category,如果parent_id不是0,那么就是subcategory.

我想得到所有有 status == 1categories & subcategories & 如果它是 subcategory,那么它的 parent category's status 应该是 1.

我制作了Category模型。

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

以上查询可以获得parent category's status == 0的子类别。 如何过滤所有类别和子类别? 谁能帮帮我?

您可以将任务分成两部分。

  1. 获取所有类别(状态 = 1 且 parent_id = 0)
  2. 获取所有子类别(status = 1 and 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().