我正在构建一个论坛,现在我想在chart.js
的图表中显示每个用户的消息计数。
在Laravel 5.4中我有这个问题:
return DB::table('message')
->select(DB::raw('count(*) as messages, extract(month from message.created_at) as month'))
->join('user', 'message.user_id', '=', 'user.id')
->where('user.id', $user->id)
->groupBy('month')
->get();
但如果0
中没有消息,则不显示month
。
所以现在我收到这个:
[16, 38, 100]
但我需要这个:
[0, 0, 0, 16, 38, 100, 0, 8, 0, 0, 0, 0]
我怎么能得到这个结果!?
非常感谢
答案 0 :(得分:3)
您可以使用array_fill_keys
生成空月份列表。
然后,使用array_replace
填写您拥有数据的月份:
$results = DB::table('message')
->selectRaw('count(*) as messages, extract(month from message.created_at) as month')
->leftjoin('user', 'message.user_id', '=', 'user.id')
->where('user.id', $user->id)
->groupBy('month')
->pluck('messages', 'month');
return array_replace(array_fill_keys(range(1, 12), 0), $results->all());
答案 1 :(得分:0)
我现在有了这个:
public function UserMessages(User $user)
{
$months = collect([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
$query = DB::table('message')
->select(DB::raw('count(*) as messages, extract(month from message.created_at) as month'))
->leftjoin('user', 'message.user_id', '=', 'user.id')
->where('user.id', $user->id)
->groupBy('month')
->pluck('messages', 'month');
return $months->map(function($value, $key) use ($query) {
if(isset($query[$key +1], $query)) {
return $query[$key +1];
}
return 0;
})->toArray();
}
但我想有一种更清洁的方式。
答案 2 :(得分:-1)
因为您使用的是join
,而不是使用left join
->leftJoin('user', 'message.user_id', '=', 'user.user_id')
当您在SQL中使用连接时,仅获取与匹配的数据,因此如果您希望首先(或在左侧)引用的表中的所有数据都使用左连接。有关SQL连接的说明,请阅读。
SQL Joins