Php 每个结果行的Laravel 5子查询

Php 每个结果行的Laravel 5子查询,php,laravel-5,eloquent,query-builder,Php,Laravel 5,Eloquent,Query Builder,我对Eloquent和Laravel 5比较陌生,我正在使用查询生成器为类别创建一个动态查询,具体取决于向函数提供了哪些变量 在my categories(我的类别)表中有一个名为“parent_id”的列,它指示类别是否为子类别。以下是我目前的功能: public static function filterCategory($vars) { $query = Category::query(); if((array_key_exists('order_by

我对Eloquent和Laravel 5比较陌生,我正在使用查询生成器为类别创建一个动态查询,具体取决于向函数提供了哪些变量

在my categories(我的类别)表中有一个名为“parent_id”的列,它指示类别是否为子类别。以下是我目前的功能:

public static function filterCategory($vars) {

        $query = Category::query();

        if((array_key_exists('order_by', $vars)) && (array_key_exists('order', $vars))) {
            $query = $query->orderBy($vars['order_by'], $vars['order']);
        }

        if(array_key_exists('product', $vars)) {
            $query = $query->whereHas('products', function($q) use ($vars){
                return $q->where('id', $vars['product']);
            });
        }

        if(array_key_exists('sub_cats', $vars)) {
            $query = $query->with('subCategories');
        }

        return $query->get();
    }
我在类别模型上创建了一个名为getChildren的函数,如下所示:

public function subCategories() {
    return $this->hasMany('App\Category', 'parent_id', 'id');
}
public function subcategories()
{
    return $this->hasMany('App\Category', 'parent_id', 'id');
}
我希望能够做到的是,当调用category函数来返回categories时,我需要为每一行执行一个子查询,这将在results对象上创建一个子数组,其中包含所有类别,这些类别的id是当前类别的“parent_id”。 我要退回这个:

[
  {
    "id": "1",
    "name": "Dr. Ben Becker DDS",
    "description": "Et atque illo ut architecto. Blanditiis laboriosam hic sed quia. Aperiam quis totam distinctio.",
    "created_at": "1981-04-07 22:04:40",
    "updated_at": "2009-02-26 19:53:09",
    "parent_id": null,
    "subcategories" : {
         //results in here
     }
  },
  {
    "id": "2",
    "name": "Ms. Winona Lehner",
    "description": "Repudiandae nostrum repellendus nulla delectus saepe sapiente ipsam. Delectus voluptatem quis excepturi. Tenetur nostrum et cum quia. Fugiat totam sed dicta totam illo ut dolores.",
    "created_at": "2002-01-13 13:42:18",
    "updated_at": "1981-10-25 11:39:14",
    "parent_id": null,
    "subcategories" : {
         //results in here
     }
  },
现在,对于我来说,在香草PHP和MYSQL中实现这一点已经足够简单了,但我不知道如何在Laravel中使用雄辩的querybuilder实现这一点

**更新 因此,我有返回的子类别,但不幸的是不正确。以下是我的输出:

[
  {
    "id": "1",
    "name": "Dr. Ben Becker DDS",
    "description": "Et atque illo ut architecto. Blanditiis laboriosam hic sed quia. Aperiam quis totam distinctio.",
    "created_at": "1981-04-07 22:04:40",
    "updated_at": "2009-02-26 19:53:09",
    "parent_id": null,
    "sub_categories": [
      {
        "id": "3",
        "name": "Dr. Manuel Medhurst",
        "description": "Pariatur ut corporis quas sequi dolor totam. Nisi ad amet velit reiciendis voluptates dolore aperiam. Impedit perferendis et a.",
        "created_at": "1998-09-20 07:40:23",
        "updated_at": "2002-04-01 18:41:24",
        "parent_id": "1"
      },
      {
        "id": "4",
        "name": "Lee Monahan",
        "description": "Nihil qui quod voluptatem non accusamus voluptas. Non et quae velit delectus consequatur vel. Qui totam non rerum sunt nisi soluta sequi. Consequatur eaque quia delectus qui assumenda.",
        "created_at": "2014-11-24 06:31:10",
        "updated_at": "1996-03-28 18:58:55",
        "parent_id": "1"
      },
      {
        "id": "5",
        "name": "Miller Osinski",
        "description": "Itaque et sed voluptatem earum nulla eligendi tenetur. Et velit ut voluptas similique. Autem rerum sapiente voluptatibus optio esse qui sit et. Alias eligendi aut quibusdam inventore.",
        "created_at": "2011-10-08 18:16:56",
        "updated_at": "1996-09-29 16:29:37",
        "parent_id": "1"
      }
    ]
  },
  {
    "id": "3",
    "name": "Dr. Manuel Medhurst",
    "description": "Pariatur ut corporis quas sequi dolor totam. Nisi ad amet velit reiciendis voluptates dolore aperiam. Impedit perferendis et a.",
    "created_at": "1998-09-20 07:40:23",
    "updated_at": "2002-04-01 18:41:24",
    "parent_id": "1",
    "sub_categories": []
  },
  {
    "id": "4",
    "name": "Lee Monahan",
    "description": "Nihil qui quod voluptatem non accusamus voluptas. Non et quae velit delectus consequatur vel. Qui totam non rerum sunt nisi soluta sequi. Consequatur eaque quia delectus qui assumenda.",
    "created_at": "2014-11-24 06:31:10",
    "updated_at": "1996-03-28 18:58:55",
    "parent_id": "1",
    "sub_categories": []
  },
  {
    "id": "5",
    "name": "Miller Osinski",
    "description": "Itaque et sed voluptatem earum nulla eligendi tenetur. Et velit ut voluptas similique. Autem rerum sapiente voluptatibus optio esse qui sit et. Alias eligendi aut quibusdam inventore.",
    "created_at": "2011-10-08 18:16:56",
    "updated_at": "1996-09-29 16:29:37",
    "parent_id": "1",
    "sub_categories": []
  },
  {
    "id": "2",
    "name": "Ms. Winona Lehner",
    "description": "Repudiandae nostrum repellendus nulla delectus saepe sapiente ipsam. Delectus voluptatem quis excepturi. Tenetur nostrum et cum quia. Fugiat totam sed dicta totam illo ut dolores.",
    "created_at": "2002-01-13 13:42:18",
    "updated_at": "1981-10-25 11:39:14",
    "parent_id": null,
    "sub_categories": []
  }
]
起初这看起来是正确的,但在我的表中,类别1只有一个子项(类别4),类别2应该只有两个子项(第3行和第5行)。似乎所有这些子类别都被错误地放入了第1行的子类别数组中


谢谢

在您的类别中向模型本身添加一个关系,如下所示:

public function subCategories() {
    return $this->hasMany('App\Category', 'parent_id', 'id');
}
public function subcategories()
{
    return $this->hasMany('App\Category', 'parent_id', 'id');
}
更改您的类别模型名称空间(如果不是应用程序)

然后,您可以像这样查询它们:

public function subCategories() {
    return $this->hasMany('App\Category', 'parent_id', 'id');
}
public function subcategories()
{
    return $this->hasMany('App\Category', 'parent_id', 'id');
}
$categories=Category::with('subcategories')->get()


如果需要,还可以按父级id进行分组以进行排列:
$categories->groupBy('parent_id')->toJson()

太棒了。那真是一种享受。这是你今天为我回答的第二个问题!很好,很高兴我能帮上忙:)抱歉,我刚刚意识到输出错误。我将更新主要问题忽略我,你的回答是正确的。我的数据库正在显示旧数据!