2016-01-28 2 views
1

У меня есть две категории «категории» и «предметы». Я хотел бы выбрать пять элементов из каждой категории. Я пробовал некоторые коды, но не работал. Как я могу сделать это в larave.Выбор предметов на основе категории

$items = DB::table('items) 
     ->leftjoin('category','category.id','=','items.categoryId') 
     ->select('items.id','items.name','items.categoryId','category.categoryName') 
     ->groupBy(items.categoryId) 
     ->limit(5) 
     ->get() 
+0

один трюк используется UNION. также посмотрите на это http://stackoverflow.com/questions/2129693/using-limit-within-group-by-to-get-n-results-per-group – PrinceG

ответ

1

Вы можете попробовать загружать предметы, но я не уверен, как применить к нему предел. Лучше всего может использовать несколько запросов:

class Category extends Model{ 
    ... 
    public function items(){ 
     return $this->belongsToMany(App\Item::class); 
    } 
} 
class Item extends Model{ 
... 
} 
$categories = Category::all(); 

$categoriesWithItems = $categories->map(function($category){ 
    return [ 
     'category' => $category, 
     'items' => $category->items()->take(5)->get(), 
    ]; 
} 
0

Если вы предпочитаете в flaxability от ручной работы запросов, вы можете сделать:

// Build and execute query 
$sql = " 
    SELECT * 
    FROM products prod 
    JOIN products_categories prodcat ON prodcat.product_id = prod.product_id 
    WHERE (product_parent_id = 0 AND product_status = 'published') 
    GROUP BY prod.category_id 
"; 
Log::info('getProducts(): ', ['category_id' => $category_id, 'sql' => $sql, 'where' => $where]); 
$result = DB::select($sql); 

$result будет содержать массив объектов

+0

Он не работает. – radiis

+0

Ну, он использует запрос в моем собственном проекте, предоставляя в качестве примера. – Brian

+0

Это я знаю. Что такое Log :: info. Я получаю ошибку в этой части – radiis

0

Laravel 5 Категория Модель Добавить это отношение

public function items() 
    { 
    return $this->hasMany(Item::class,'category_id'); 
    } 

товара Модель добавить эти отношения

public function category() 
    { 
    return $this->belongsTo(Category::class); 
    } 

Затем контроллер вы можете просто написать, как этот

$categories = Category::all(); 
     return view('tasks.item', [ 
     'categories' => $categories 
    ]); 

В целях сделать петлю Еогеасп через категорию, а затем вызвать другой цикл Еогеасп хотя ваши вопросы ДО 5

@foreach ($categories as $category) 
          <tr> 
           <!-- Task Name --> 
           <td class="table-text"> 
            <div>{{ $category->category_name }}</div> 
           </td> 
           <td> 
            @foreach($category->items->take(5) as $item) 
             {{ $item->name }} 
            @endforeach 
           </td> 
          </tr> 
         @endforeach 
Смежные вопросы