Laravel 5.2 - 获取属于n个子类别的类别和产品的产品

时间:2017-03-04 14:37:35

标签: laravel laravel-5.2

我正在使用laravel 5.2开发电子商务网站。每个产品属于一个类别,因此我们在products表上添加了CategoryID字段。

当用户选择某个类别时,我们可以显示属于该类别的产品。但现在,需要显示属于所选类别下的类别的产品。

以下是澄清事情的例子

分类

  • 电子产品 - >智能手机 - > Apple - > iPhone
  • 电子产品 - >智能手机 - > Android - >三星
  • 电子产品 - >笔记本电脑 - >联想

产品

  • 名为iPhone 6S的产品属于iPhone类别
  • 名为Galaxy S7的产品属于Samsung Category
  • 名为Lenovo x240的产品属于Lenovo Category

当前系统可以轻松显示每个类别中的产品。但我们现在要做的是:

  • 当我进入智能手机类别时,我应该看到Galaxy S7和iPhone 6s
  • 当我进入Electonics类别时,我应该看到Galaxy S7,iPhone 6s和联想x240

类别表具有CategoryID主键,CategoryName和Parent。 如果parent = 0,则表示该类别没有父

Categories Table

类别模型

<?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

所以,这是我的问题

  1. 我如何生成如上所述的查询

  2. 在性能方面是否有更好的选择。也许是一个查询可以获得所需产品的查询次数较少

  3. 由于

0 个答案:

没有答案