2016-01-01 5 views
0

У меня проблема с получением данных с помощью groupBy, я не знаю, где я ошибаюсь, я делал это много раз раньше, но сегодня я ошибаюсь, где и не знаю знаете где. Ниже приводится таблица, из которой я хочу, чтобы выбрать данные:GroupBy Query Laravel 5.1

Таблица Имя: user_questions

id | user_id | message | read_status_user | read_status_support | answered 

Теперь предположим, что если один пользователь отправляет более одного сообщения, то user_id будет повторяться, так хотят все сообщения от одного конкретного пользователя, я обжиг запрос, как следующее:

UserQuestion::groupBy('user_id')->get(); 

Это должно дать мне результат, как

user_id = 1 > message1 
user_id = 1 > message2 
.... 
user_id = 1 > message...(if any) 

user_id = 2 > message1 
user_id = 2 > message2 
..... 
So on... 

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

Пожалуйста, помогите мне с этим. Вся помощь будет высоко оценена. Спасибо всем вам заранее.

+0

опубликовать полный запрос –

+0

Привет братан Я уже написал запрос в вопросе, но опубликовать его снова для вас UserQuestion :: группеПо («user_id») -> получить(); (UserQuestion - это модель) – Siddharth

+0

хотите полный код. а не только его часть –

ответ

0

Попробуйте как этот

$users = DB::table('table_name') 
     ->groupBy('user_id') 
     ->get(); 

после этого толчка, что цикл по каждому элементу

foreach ($users as $user) 
{ 
    var_dump($user->name); 
} 

ordering-grouping-limit-and-offset in Laravel

+0

Я попробовал этот запрос тоже, но этот запрос не дают мне все сообщения от одного пользователя, он дает мне только первое сообщение одного пользователя – Siddharth

+0

есть ли уникальная вещь, чтобы добавить в где clauese таблицы ?? –

+0

Нет такой вещи, чтобы добавить там, где предложение прямо сейчас – Siddharth

1

Проблема здесь в том, что вы вызываете groupBy функцию объекта построитель запросов, который генерирует запрос для вашей базы данных. Когда вы вызываете метод ->get(), запрос выполняется и возвращается объект Collection, содержащий результаты. То, что вы ищете, - это метод groupBy класса Laravel Collection, что означает, что вам нужно поставить ->groupBy('user_id') после ->get().

Если у вас есть следующие данные:

user_question 
user_id  question_id 
1   1 
1   2 
1   3 
2   4 
3   5 
3   6 

Ваш текущий код

UserQuestion::groupBy('user_id')->get(); 

выполняет этот запрос

select * from user_question group by user_id; 

возвращающегося одну строку для каждого пользователя, так это то, что group by делает в MySQL.

user_id  question_id 
1   1 
2   4 
3   5 

Если вместо этого, вы следующие

$collection = UserQuestion::get(); 

запрос просто

select * from user_question 

и когда вы звоните $collection->groupBy('user_id') на эту коллекцию, вы получите данные структурированы как

[ 
    1 => [ 
     [ 'user_id' => 1, 'question_id' => 1 ], 
     [ 'user_id' => 1, 'question_id' => 2 ], 
     [ 'user_id' => 1, 'question_id' => 3 ] 
     ], 
     2 => [ 
      [ 'user_id' => 2, 'question_id' => 4 ], 
     ], 
     3 => [ 
      [ 'user_id' => 3, 'question_id' => 5 ], 
      [ 'user_id' => 3, 'question_id' => 6 ] 
     ] 
] 
0

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

public function questions() 
{ 
    return $this->hasMany('App\UserQuestion'); 
} 

Тогда я хотел бы получить все пользователи и цикл через них, чтобы получить свои сообщения.

$users = User::all(); 
$users->each(function ($user) { 
    $questions = User::find($user->id)->questions; 
}); 
Смежные вопросы