我正在使用laravel 5.2开发电子商务网站。每个产品属于一个类别,因此我们在products表上添加了CategoryID字段。
当用户选择某个类别时,我们可以显示属于该类别的产品。但现在,需要显示属于所选类别下的类别的产品。
以下是澄清事情的例子
分类
产品
当前系统可以轻松显示每个类别中的产品。但我们现在要做的是:
类别表具有CategoryID主键,CategoryName和Parent。 如果parent = 0,则表示该类别没有父
类别模型
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Categories extends Model
{
protected $primaryKey = 'CategoryID';
public function products()
{
return $this->hasMany('App\Product', 'CategoryID');
}
public function children(){
return $this->hasMany('App\Category', 'Parent', 'CategoryID');
}
public function recursiveChildren()
{
return $this->children()->with('recursiveChildren');
}
}
产品型号
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
protected $primaryKey = 'ProductID';
public function Category()
{
return $this->belongsTo('App\Category', 'CategoryID');
}
}
我尝试了什么
我尝试使用laravel的预先加载
来显示类别中的产品public function show($CategoryID)
{
$products = Categories::with(array(
'recursiveChildren' => function ($query) {
$query->orderBy('ProductName', 'asc');
}
))
->orderBy('Name', 'asc')
->where('CategoryID', '=', $CategoryID)
->get();
return view('categories.show', compact('products '));
}
有趣的是,上面的查询按预期工作,但在类别层次结构中不超过2级。当我浏览电子类别(CategoryID = 1)时,使用DebugBar我可以看到上面的函数生成了以下查询
select * from `categories` where `CategoryID` = '1' and `categories`.`deleted_at` is null order by `Name` asc
select * from `categories` where `categories`.`Parent` in ('1') and `categories`.`deleted_at` is null
select * from `categories` where `categories`.`Parent` in ('5', '17') and `categories`.`deleted_at` is null
select * from `categories` where `categories`.`Parent` in ('24', '31', '35') and `categories`.`deleted_at` is null
select * from `products` where `products`.`CategoryID` in ('5', '17') and `products`.`deleted_at` is null order by `Title` asc
底部查询部分正确,但我不知道为什么它没有将产品归入属于电子产品的类别。
最后一个查询应该是
select * from `products` where `products`.`CategoryID` in ('35', '31', '24', '17', '5') and `products`.`deleted_at` is null order by `ProductName` asc
所以,这是我的问题
我如何生成如上所述的查询
在性能方面是否有更好的选择。也许是一个查询可以获得所需产品的查询次数较少
由于