每个结果行 Laravel 5 sub-query
Laravel 5 sub-query for each result row
我对 Eloquent 和 Laravel 5 比较陌生,我正在使用查询构建器根据向函数提供的变量来创建类别动态查询。
在我的类别 table 中有一个名为 'parent_id' 的列,它指示类别是否为 sub-category。到目前为止,这是我的功能:
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');
}
我想要做的是当我的类别函数被调用到 return 类别时,我需要为每一行执行一个 sub-query,这将创建一个 sub-array 结果 object 包含所有类别,这些类别具有当前类别的 ID,因为它是 'parent_id'。
我想要这个 returned:
[
{
"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
}
},
现在,这对我来说在 vanilla PHP 和 MYSQL 中很简单,但我不知道如何在 Laravel 中使用 Eloquent查询生成器。
**更新
所以我有子类别 returning 但不幸的是不正确。这是我的输出:
[
{
"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": []
}
]
起初这看起来是正确的,但在我的 table 中,类别 1 只有 1 child(类别 4),类别 2 应该只有 2 children(第 3 和 5 行) .似乎所有这些 sub-categories 都被错误地放入了第 1 行的子类别数组中?
谢谢
在你的 Category 模型中添加一个关系到它自己,就像这样:
public function subcategories()
{
return $this->hasMany('App\Category', 'parent_id', 'id');
}
如果不是 App,请更改您的 Category 模型命名空间。
然后你就可以这样查询它们了:
$categories = Category::with('subcategories')->get();
如果需要也可以按parent_id分组排列:$categories->groupBy( 'parent_id' )->toJson();
我对 Eloquent 和 Laravel 5 比较陌生,我正在使用查询构建器根据向函数提供的变量来创建类别动态查询。
在我的类别 table 中有一个名为 'parent_id' 的列,它指示类别是否为 sub-category。到目前为止,这是我的功能:
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');
}
我想要做的是当我的类别函数被调用到 return 类别时,我需要为每一行执行一个 sub-query,这将创建一个 sub-array 结果 object 包含所有类别,这些类别具有当前类别的 ID,因为它是 'parent_id'。 我想要这个 returned:
[
{
"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
}
},
现在,这对我来说在 vanilla PHP 和 MYSQL 中很简单,但我不知道如何在 Laravel 中使用 Eloquent查询生成器。
**更新 所以我有子类别 returning 但不幸的是不正确。这是我的输出:
[
{
"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": []
}
]
起初这看起来是正确的,但在我的 table 中,类别 1 只有 1 child(类别 4),类别 2 应该只有 2 children(第 3 和 5 行) .似乎所有这些 sub-categories 都被错误地放入了第 1 行的子类别数组中?
谢谢
在你的 Category 模型中添加一个关系到它自己,就像这样:
public function subcategories()
{
return $this->hasMany('App\Category', 'parent_id', 'id');
}
如果不是 App,请更改您的 Category 模型命名空间。
然后你就可以这样查询它们了:
$categories = Category::with('subcategories')->get();
如果需要也可以按parent_id分组排列:$categories->groupBy( 'parent_id' )->toJson();