如何向DB实现此类请求

时间:2017-02-02 19:23:04

标签: laravel model-view-controller

在视图中我有两个foreach:第一个输出所有类别,第二个输出应该从当前类别输出每个品牌。

示例:

// Controller
$categories = DB::table('products')
                ->join('categories', 'products.c_id', '=', 'categories.id')
                ->select('categories.name as cat')
                ->groupBy('categories.name')
                ->get();
$brands = DB::table('products')
                ->join('categories', 'products.c_id', '=', 'categories.id')
                ->join('brands', 'products.b_id', '=', 'brands.id')
                ->select('brands.name as brand')
                ->where('categories.id', '=', '1')<-- the problem part
                ->groupBy('brands.name')
                ->get();

//view
@foreach($categories as $category)
    <li><a>{{ $category->cat}}</a>
        <ul class="sort-section">
            <li><a href="#"><strong>All {{$category->cat}}</strong></a></li>
            @foreach($brands as $brand)
                <li><a href="#">{{ $brand->brand }}</a></li>
            @endforeach
        </ul>
    </li>
@endforeach

我不知道如何正确输出它。现在我正在获取记录where categories.id = 1(我这样做是为了检查我的代码是否正常工作),而不是1我应该使用当前的id category。换句话说,如果我想让它发生,无论如何,我会在我的视图中首先在foreach中实现第二个查询(这很疯狂)。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

有两种不同的方法可以解决这个问题。

第一种是更丑陋的方式,但仍然可以解决问题。您可以将其拆分为两个不同的部分。用户首先选择提交发布请求的类别,然后捕获类别ID,然后查询并仅返回与该类别关联的品牌。这会强制页面重新加载。

第二种是更清洁的方式,它使用的是AJAX。使用JQuery使这很容易,这里的答案可以告诉你如何开始: Using AJAX

答案 1 :(得分:1)

您可以只使用一个查询,例如:

//控制器

$getAll = DB::table('categories')
                    ->leftJoin('products', 'products.c_id', '=', 'categories.id')
                    ->leftJoin('brands', 'brands.id', '=', 'products.b_id')
                    ->groupBy('brands.name')
                    ->groupBy('categories.name')
                    ->get([
                        'categories.id as id',
                        'categories.name as cat',
                        'brands.name as brand'
                    ]);

        $categories = [];
        if (count($getAll)) {
            foreach ($getAll as $single) {
                if (!isset($categories[$single->id])) {
                    $categories[$single->id] = new \StdClass();
                }
                $categories[$single->id]->cat = $single->cat;
                $categories[$single->id]->brands[] = $single->brand;
            }
        }

然后在你看来做这个

@foreach($categories as $category)
 <li><a>{{ $category->cat}}</a>
   <ul class="sort-section">
     <li><a href="#"><strong>All {{$category->cat}}</strong></a></li>
     @foreach($category->brands as $brand)
        <li><a href="#">{{ $brand }}</a></li>
     @endforeach
   </ul>
 </li>
@endforeach