我正在尝试设置一个数据库,以便我可以查询它并获取某个类别的所有产品并查询特定的子类别。
我有产品表
id | title | category_id (fk)
和类别表:
id | title | parent
所以如果类别看起来像这样:
id | title | parent
1 | books | null
2 | crime | 1
3 | spy | 2
4 | dvd | null
5 | cd | null
产品:
id | title | category_id (fk)
1 | 007 | 3
1 | Murder| 2
产品属于一个类别。在' 007'之上产品属于' Spy'子类别。 '谋杀'属于' Crime'子类别。两者都属于父母的书籍。类别。
我如何查询数据库:
获取子类别的所有产品(例如间谍我会得到' 007')
获取所有产品的父类别,所以如果我想要所有产品的书籍,我会得到' 007'和'谋杀'
答案 0 :(得分:0)
您可以找到父类别的所有子类别,然后使用它来获取相关产品。下面的解决方案假设您为所描述的每个表都有Eloquent Models,因此Category
和Product
模型。
Product
模型不需要任何其他代码,只需要存在。 Category
模型必须如下所示:
namespace App;
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
public function products()
{
// Build an array containing the parent category ID and all subcategory IDs found
$categoryIds = array_merge([$this->id], $this->subcategoryIds());
// Find all products that match the retrieved category IDs
return Product::whereIn('category_id', $categoryIds)->get();
}
protected function subcategoryIds($id = null, &$ids= [])
{
// If no ID is passed, set the current model ID as the parent
if (is_null($id)) {
$id = $this->id;
}
// Find subcategory IDs
$categoryIds = $this->query()->where('parent', $id)->lists('id');
// Add each ID to the list and recursively find other subcategory IDs
foreach ($categoryIds as $categoryId) {
$ids[] = $categoryId;
$ids += $this->subcategoryIds($categoryId, $ids);
}
return $ids;
}
}
现在要查找Books
类别中的产品,您只需要id
找到它并在模型上调用products
方法:
$products = App\Category::find(1)->products();