【问题标题】:groupBy('created_at') using subquery in laravel eloquentgroupBy('created_at') 在 laravel eloquent 中使用子查询
【发布时间】:2018-07-29 14:26:32
【问题描述】:

我正在为我的项目中的库存做一份报告。现在,我想根据日期显示items。我想通过对created_at 进行分组来在视图中显示项目列表,如下所示-

我的数据库表结构是 -

在控制器方法中,我写了-

public function inventorySubmit(Request $request)
{
    $itemId     = $request->item;
    $startDate  = Carbon::parse($request->start_date)->format('Y-m-d');
    $endDate    = Carbon::parse($request->end_date)->format('Y-m-d');
    $reportType = $request->report_type;

    if ($itemId) {
        $items = Item::where('id', $itemId)->whereBetween('created_at', [ $startDate, $endDate ])->where('status', 1)->get();
    }else{
        $items = Item::whereBetween('created_at', [ $startDate, $endDate ])->where('status', 1)->get();
    }
    return view('report.inventory.searched-result', compact('reportType', 'startDate', 'endDate', 'items'));
}

在刀片中,我表现得像 -

<table class="table text-center" style="text-align: left; width: 100%;">
    <tr>
        <td style="font-weight: bold;">#</td>
        <td style="font-weight: bold;">Date</td>
        <td style="font-weight: bold;">Opening Balance</td>
    </tr>
    @foreach($items as $item)
    <tr>
        <td>{{ $loop->index + 1 }}</td>
        <td>{{ date('jS F, Y', strtotime($item->created_at)) }}</td>
        <td>
            <span>{{ $item->name }}</span> - <span>{{ $item->opening_balance }} <br></span>
        </td>
    </tr>
    @endforeach

</table>

【问题讨论】:

    标签: mysql laravel eloquent subquery nested-queries


    【解决方案1】:

    get之后使用laravelgroupBy这样的方法

    控制器

    public function inventorySubmit(Request $request)
    {
        $itemId     = $request->item;
        $startDate  = Carbon::parse($request->start_date)->format('Y-m-d');
        $endDate    = Carbon::parse($request->end_date)->format('Y-m-d');
        $reportType = $request->report_type;
    
        if ($itemId) {
            $items = Item::select('*', DB::raw('Date(created_at) as date'))
                          ->where('id', $itemId)->whereBetween('created_at', [ $startDate, $endDate ])
                          ->where('status', 1)
                          ->get()
                          ->groupBy('date');
        }else{
            $items = Item::select('*', DB::raw('Date(created_at) as date'))
                          ->whereBetween('created_at', [ $startDate, $endDate ])
                          ->where('status', 1)
                          ->get()
                          ->groupBy('date');
        }
        return view('report.inventory.searched-result', compact('reportType', 'startDate', 'endDate', 'items'));
    }
    

    在视图中

    <table class="table text-center" style="text-align: left; width: 100%;">
        <tr>
            <td style="font-weight: bold;">#</td>
            <td style="font-weight: bold;">Date</td>
            <td style="font-weight: bold;">Opening Balance</td>
        </tr>
        @foreach($items as $groupitem)
        <tr>
            <td>{{ $loop->index + 1 }}</td>
            <td>{{ date('jS F, Y', strtotime($groupitem->first()->created_at)) }}</td>
            <td>
                @foreach($groupitem as $item)
                   <span>{{ $item->name }}</span> - <span>{{ $item->opening_balance }} <br></span>
                @endforeach
            </td>
        </tr>
        @endforeach
    
    </table>
    

    【讨论】:

    • groupBy 这里是集合 groupBy 所以需要回调而不是查询,例如groupBy(function ($item) { return $item-&gt;created_at-&gt;format('Y-m-d'); })
    • 出现Argument 2 passed to Illuminate\Database\Query\Builder::selectRaw() must be of the type array, object given 错误
    • 使用selectRaw('*, Date(created_at) as date')select('*', DB::raw('Date(created_at) as date')) - 不要混用。同样在-&gt;get() 之后,您应该使用-&gt;groupBy('date')
    猜你喜欢
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    相关资源
    最近更新 更多