2017-02-22 31 views
0

Как сгруппировать записи таблицы, основанные на аналогичном ид в Laravel Для примера: в MySQL продуктах таблица имеет folllowing записи с одинаковым кошка ID Именем таблицы: продуктыLaravel - группа записи на основе сходного ид в Laravel

id:1 pro_name:xyz1 cat_id:55 
id:2 pro_name:xyz2 cat_id:22 
id:3 pro_name:xyz3 cat_id:55 
id:4 pro_name:xyz4 cat_id:22 

Что я пытаюсь сделать для аналогичного cat_id, он должен сделать свой массив. Я пытаюсь использовать

$all = Products::groupBy('cat_id')->get(); 

Но его отображение только первой записи каждого подобного cat_id.

выхода я получаю:

{ 
    "id": 1, 
    "pro_name": "xyz1", 
    "cat": "55", 
    "created_at": "2017-02-09 13:09:13", 
    "updated_at": "2017-02-18 11:56:04" 
    }, 
    { 
    "id": 2, 
    "pro_name": "xyz2", 
    "cat": "22", 
    "created_at": "2017-02-22 06:04:23", 
    "updated_at": "2017-02-22 06:04:23" 
    } 

Я хочу, чтобы он должен показать все записи подобного идентификатора в массиве Помогите мне для этого

+0

Вы можете поделиться желаемым результатом. – DevOps

+0

Может использовать GROUP_CONCAT, но чтобы получить тот же массив, вам нужно запустить отдельный запрос. – DevOps

ответ

1

Группу путем суммирования вашей таблицы с использованием заданных параметров (следовательно, она показывает только первую, а в ответе Наини рассчитывается общая сумма для сгруппированных элементов).

Возможно, вы ищете заказ By?

$info = DB::table('Products') 
    ->orderBy('cat_id') 
    ->get(); 

Вы получите результаты из всей таблицы, отсортированные по cat_id, и будет определять, когда категория изменяется вручную.

Другой альтернативой является получение отдельных cat_id, а затем запуск собственного запроса на них. Вы можете инкапсулировать код в модели или в репозиторий. Обратите внимание, что в вашей базе данных будет выполняться ряд запросов, что может быть нежелательно.

//Create an array 
$groups = [] 

//Retrieve the list of cat_id's in use. 
$cats = DB::table('Products')->distinct()->select('cat_id')->get() 

//for each cat_id in use, find the products associated and then add a collection of those products to the relevant array element 
foreach($cats as $cat){ 
    $groups[$cat->cat_id] = DB::table('Products')->where('cat_id', $cat->cat_id)->get(); 
} 

Примечание: Моя единственная забота о том, что вы здесь делаете, заключается в том, что вы действительно ищете отношения? Если вы использовали Eloquent, все это становится очень простым.

0

Может попробовать этот

$info = DB::table('Products') 
     ->select('cat_id', DB::raw('count(*) as total'), 
      DB::raw("GROUP_CONCAT(pro_name) AS product_name")) 
     ->groupBy('cat_id') 
     ->get(); 
+0

Это показывает вывод как '{ "cat_id": "22", "общей": "2" }, { "cat_id": "55", "общей": "2" },' @Naincy – Mohammed

+0

Да, это показывает, что для cat_id у вас есть 2 записи, а для 55 также у вас есть 2 записи – Naincy

+0

Но я хочу, чтобы все поля были неточными. @Naincy – Mohammed

0

Привет Вы должны попробовать этот код ...

$ строка = Продукты :: selectRaw ("pro_name, cat_id") -> группеПо ("cat_id", "pro_name") -> получить();

  echo "<pre>"; 
      print_r($row);