Php 从父母那里得到所有的孩子模型多对多关系拉威尔口若悬河

Php 从父母那里得到所有的孩子模型多对多关系拉威尔口若悬河,php,laravel,eloquent,eloquent-relationship,Php,Laravel,Eloquent,Eloquent Relationship,我正在建立一个电子商务网站使用拉威尔5.8,并有以下问题。我希望从一个类别及其子类别中检索所有产品,但能够在代码中执行过滤查询。例如,产品的价格限制和数量可用性 商店有类别,在同一个表中有子类别。 类别表(简化)id | name | parent_id-其中if parent_id!=0,则该类别被视为主类别的子类别 产品可以在多个类别中,因此我使用多对多关系。 产品表(简化)id |名称… 产品类别表-id |产品| id |类别| id 我的产品型号如下所示: public functio

我正在建立一个电子商务网站使用拉威尔5.8,并有以下问题。我希望从一个类别及其子类别中检索所有产品,但能够在代码中执行过滤查询。例如,产品的价格限制和数量可用性

商店有类别,在同一个表中有子类别。 类别表(简化)id | name | parent_id-其中if parent_id!=0,则该类别被视为主类别的子类别

产品可以在多个类别中,因此我使用多对多关系。 产品表(简化)id |名称… 产品类别表-id |产品| id |类别| id

我的产品型号如下所示:

public function categories()
{
    return $this->belongsToMany(
        'App\CatalogCategory', 
        'catalog_product_categories', 
        'product_id', 
        'category_id'
    );
}
和我的分类模型:

public function allProducts()
{
    return $this->belongsToMany(
        'App\CatalogProduct', 
        'catalog_product_categories', 
        'category_id', 
        'product_id'
    )
        ->where('is_active', 1)
        ->whereDate('active_from', '<=', Carbon::now('Europe/Sofia'))
        ->where(function ($query)
        {
            $query->whereDate('active_to', '>=', Carbon::now('Europe/Sofia'))
                ->orWhereNull('active_to');
        })
        ->wherePivotIn('category_id', $this->allChildrenIds());;  
}

好的,我想问题是
->wherePivotIn('category_id',$this->allChildrenIds())

您正在尝试获取某个类别的产品-可以通过pivot表中的一行来标识相应的记录,该行具有该类别的id和各种其他产品的id

但是wherePivotIn在
$this->allChildrenIds()
中不包含当前类别的id,因此不会返回任何记录

定义不带wherePivotIn的关系

公共功能所有产品()
{
返回$this->belongtomany(
“应用程序\目录产品”,
“目录产品类别”,
“类别_id”,
“产品标识”
)
->其中('is_active',1)
->其中日期('active_from','=',Carbon::now('Europe/Sofia'))
->或wherenull('active_to');
});  
}
然后获取当前类别及其所有子类别的所有产品

$category=category::with(['products','subcategories.products'])->get();

通过此查询,与子类别关联的产品将分别嵌套在每个子类别下。

定义的关系命名为
products
,因此应作为
$category->products进行访问-不是所有的产品都很糟糕,没有正确复制。我已经编辑过了。这是可行的,但是有没有办法通过一些查询将所有产品放在一个集合中?我需要有能力查询产品的价格范围,并获得计数聚合一个简单的方法,以获得所有产品在一个单一的集合将作出两个查询:首先查询所有类别与子类别和提取id的。在第二次查询中使用这些id来获取类别id在id数组中的所有产品,然后您可以附加价格范围的其他where条件
$category = CatalogCategory::find(3);
dd($category->allProducts);