0

如果产品仅与一个“子类别”相关,我如何获得“主类别”的所有产品?产品仅与子类别相关,而子类别始终是主要类别的一部分。所以我想把所有产品都放在主要类别中。像下面这样的查询将不起作用或不返回任何产品,因为没有产品与类别 #1 相关。

Categories::where(['id' => 1])->products();

模型/类别.php

public function parent(): BelongsTo
{
    return $this->belongsTo(Category::class, 'parent_id');
}

public function children(): HasMany
{
    return $this->hasMany(Category::class, 'parent_id');
}

型号/Product.php

public function category(): BelongsTo
{
    return $this->belongsTo(Category::class);
}

我需要做什么/更改才能获得主要类别的所有产品(最好不检查 ID #1 的类别是否是主要类别)?

4

2 回答 2

0

你可以使用hasManyThrough关系。你从这个链接检查

将此代码添加到您的Category模型中:

public function products(){
    return $this->hasManyThrough(
        Product::class,
        Category::class,  
        "parent_id", 
        "category_id", 
        "id", 
        "id"
    );
}

也许,我错了你的外键和主键。请检查一下。

于 2021-07-01T12:39:06.373 回答
0

查询分层数据结构的这个问题的一个常见解决方案是闭包表。网上有很多关于这种模式的讨论,所以我不会尝试完全重述,但简短的总结是,您存储每个对象及其所有祖先之间的每条路径以及它们之间的深度。这为您提供了一个包含列(ancestor_id、descendant_id、depth)的表,因此您可以通过该表连接以收集链接到任何给定后代的祖先或任何祖先的后代的所有对象。

这是一个示例查询,它在实践中如何查询给定祖先类别的所有后代,可能存在一些语法问题,因为我没有真正的数据库来运行它。

SELECT products.* FROM products
  INNER JOIN category_closure ON products.category_id = category_closure.descendant_id
WHERE category_closure.ancestor_id = 1;

我们目前将此解决方案用于几乎完全相同的问题,即在类别层次结构中的任何位置分配产品。但是,我们在 Doctrine 项目中这样做,因此我们的解决方案的实现细节可能在这里没有帮助。

Laravel 中有一些现有的库可以让这更容易,例如https://github.com/franzose/ClosureTable(我不能保证质量,现在在搜索中找到)。

于 2021-07-01T13:19:39.383 回答