簡體   English   中英

每個結果行的Laravel 5子查詢

[英]Laravel 5 sub-query for each result row

我對Eloquent和Laravel 5相對較新,並且正在使用查詢生成器根據要提供給函數的變量來創建類別的動態查詢。

在我的類別表中,有一列稱為“ 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();
    }

我在Category模型上創建了一個名為getChildren的函數,該函數如下所示:

public function subCategories() {
    return $this->hasMany('App\Category', 'parent_id', 'id');
}

我想做的是,當調用我的類別函數以返回類別時,我需要為每行執行一個子查詢,這將在結果對象上創建一個子數組,該結果數組包含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中執行此操作已經足夠簡單了,但是我不知道如何使用Eloquent查詢構建器在Laravel中實現。

**更新因此,我有返回的子類別,但不幸的是不正確。 這是我的輸出:

[
  {
    "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應該只有2個孩子(行3和5)。 似乎所有這些子類別都被錯誤地放置在第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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM