Laravel 5.4按月查询

时间:2017-04-28 12:01:33

标签: sql laravel graph eloquent

我正在构建一个论坛,现在我想在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]

我怎么能得到这个结果!?

非常感谢

3 个答案:

答案 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')

For Refernce

当您在SQL中使用连接时,仅获取与匹配的数据,因此如果您希望首先(或在左侧)引用的表中的所有数据都使用左连接。有关SQL连接的说明,请阅读。
SQL Joins