Как реализовать данный запрос

477
05 февраля 2017, 12:26

На въюхе у меня должно быть два цикла: один выводит все категории, второй, который находится внутри первого, выводит все бренды данной категории. Пример:

//model
        $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')<-- об этом речь пойдёт ниже
                ->groupBy('brands.name')
                ->get();
//view
                @foreach($categories as $category)
                <li><a>{{ $category->cat }}</a>
                    <ul class="sort-section">
                        <li><a href="#"><strong>All CPUs</strong></a></li>
                        @foreach($brands as $brand)
                        <li><a href="#">{{ $brand->brand }}</a></li>
                        @endforeach
                    </ul>
                </li>
                @endforeach

Проблема заключается в выделенной мною строчкой в модели. Я "выбираю" записи, где id категории = 1(проверял или всё остальное работает), когда на самом деле мне нужно выбирать id поточной категории(поточной на въюхе). Другими словами, если бы я это делал по-простому и по-неправильному, то я бы второй запрос осуществлял бы внутри первого foreach на въюхе. Каким образом можно решить данный вопрос?

Answer 1

Работает следующим образом:

// Controller

$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;
            }
        }

//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($category->brands as $brand)
        <li><a href="#">{{ $brand }}</a></li>
     @endforeach
   </ul>
 </li>
@endforeach
Answer 2

Для такой ситуации в Laravel существует hasManyThrough

Добавояем метод в модель категории, если правильно построена бд и не надо явно указывать по каким полям то так:

class Category extends Model {
    public function brands()
    {
        return $this->hasManyThrough('App\Brand', 'App\Product');
    }
}

Теперь в контролере можно вызвать $category->brands

READ ALSO
Запись в массивы

Запись в массивы

Народ подскажите решениеЕсть пользователь который с консоли вводит числа эти числа переводятся в другую систему координат и их надо записать...

522
Как подключить fxml файл к коду javafx?

Как подключить fxml файл к коду javafx?

Здравствуйте, что-то совсем запутался с fxmlУ меня есть два Java-класса

635
Как менять текст каждый раз?

Как менять текст каждый раз?

У меня при подгрузке данных с rss во время ожидания выводится текст который прописан в stringsМожно ли составить список фраз которые будут выводится...

427
html теги и атрибуты, jsoup

html теги и атрибуты, jsoup

Добрый вечер! У меня есть html (часть)

526