Коллекция Laravel становится пустой внутри петель foreach - PullRequest
0 голосов
/ 31 марта 2019

У меня есть 3 коллекции по разным элементам, которые мне нужно показать и сгруппировать по дате, в блейд-файле я перебираю даты, чтобы показать эти коллекции, но по какой-то причине, какой бы ни была первая коллекция, с ней что-то не так,оно не должно меняться в зависимости от даты, скажем, у меня есть две даты (2019-03, 2019-01), в результате я получаю два разных экземпляра одной и той же коллекции: один с данными иодин без (пустая коллекция), хотя я вызываю ту же переменную.

Метод контроллера:

public function index()
{
    //Retrieving the Models.
    $invoices_egp = auth()->user()->invoices()->where('paid', 1)->where('currency', 'EGP');
    $invoices_usd = auth()->user()->invoices()->where('paid', 1)->where('currency', 'USD');
    $orders = \App\Order::where('vendor_id', auth()->user()->id)->where('paid', 1);

    //Getting the different dates of these Models.
    $egp_invoices_dates = $invoices_egp->get()->map(function ($invoice) {
        return Carbon::parse($invoice->created_at)->format('Y-m');
    });
    $usd_invoices_dates = $invoices_usd->get()->map(function ($invoice) {
        return Carbon::parse($invoice->created_at)->format('Y-m');
    });
    $orders_dates = $orders->get()->map(function ($order) {
        return Carbon::parse($order->created_at)->format('Y-m');
    });

    //Getting the unique dates.
    $dates = $orders_dates->merge($usd_invoices_dates)->merge($egp_invoices_dates)->unique();

    return view('dashboard.vendor.reports.index', compact('invoices_egp', 'invoices_usd', 'orders', 'dates'));
}

Соответствующая часть блейд-файла:

<div class="col-lg-12">
    @if ( count( $dates ) )
    @foreach($dates as $date)
        <div class="card-box">
            <div class="table-responsive">
                <table class="table table-actions-bar m-b-0">
                    <thead>
                        <tr>
                            <th>
                                Month
                            </th>
                        </tr>
                        <tr>
                            <td>
                                {{ $date }}
                            </td>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                            <th colspan="100%">Type</th>
                            <th>Total</th>
                        </tr>
                        <tr>
                            @if(count($invoices_egp->get()))
                                <td colspan="100%">Invoice in EGP</td>
                                <td>{{ $invoices_egp->whereYear('paid_at', \Carbon\Carbon::parse($date)->year)->whereMonth('paid_at', \Carbon\Carbon::parse($date)->month)->sum('total') }}</td>
                            @endif
                        </tr>
                        <tr>
                            @if(count($invoices_usd->get()))
                                <td colspan="100%">Invoice in USD</td>
                                <td>{{ $invoices_usd->whereYear('paid_at', \Carbon\Carbon::parse($date)->year)->whereMonth('paid_at', \Carbon\Carbon::parse($date)->month)->sum('total') * \App\ConversionRate::dollarToEGP() }}</td>
                            @endif
                        </tr>
                        <tr>
                            @if(count($orders->get()))
                                <td colspan="100%">Orders</td>
                                <td>{{ $orders->whereYear('paid_at', \Carbon\Carbon::parse($date)->year)->whereMonth('paid_at', \Carbon\Carbon::parse($date)->month)->sum('total') }}</td>
                            @endif
                        </tr>
                    </tbody>
                </table>
            </div>
        </div>
    @endforeach
    @else
    <div class="card-box">
        <h3>No Data</h3>
    </div>
    @endif
</div>

Здесь, когда я по какой-то причине перебираю переменную $ date, переменная $ invoices_egp изменяется в зависимости от даты, даже если она не имеет к этому никакого отношения, если я пытаюсь сбросить $ invoices_egp (в котором есть две записи с одинаковой датой 2019-01) в каждом цикле, я ожидаю получить две записи дважды независимо от даты, вместо этого я получаю две записи на первом1-й цикл ($ date = 2019-03 ), а во втором цикле ($ date = 2019-01 ) я получаю пустую коллекцию.

У меня естьпробовал разные вещи, я заменил переменную дат жестко закодированным массивом и удалил другие запросы дат, в блейд-файле ничего не изменилось.

Что даже более странно в том случае, если я изменил место$ invoices_egp с $ invoices_usd, я правильно отображаю $ invoices_egp, и вместо этого возникает ошибка с переменной $ invoices_usd, поэтому, какой бы ни была первая переменная, она испортилась.

Небольшое обновление

Я еще не знаю, что не так, но как только я закомментирую эту строку

<td>{{ $invoices_egp->whereYear('paid_at', \Carbon\Carbon::parse($date)->year)->whereMonth('paid_at', \Carbon\Carbon::parse($date)->month)->sum('total') }} EGP</td>

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

Если я сбрасываю переменную в каждом цикле, тоэто то, что я получаю в первом цикле

Collection {#522 ▼
  #items: array:2 [▼
    0 => Invoice {#526 ▶}
    1 => Invoice {#519 ▶}
  ]
}

И это то, что я получаю во втором цикле (с вышеупомянутой строкой без комментариев)

Collection {#516 ▼
  #items: []
}

Та же переменная, разные результаты запетля.

1 Ответ

0 голосов
/ 01 апреля 2019

Так что, очевидно, с тех пор, как я передавал экземпляр построителя запросов представлению, это было на самом деле было изменено циклом foreach, что я никогда не думал, что произойдет, в любом случае, исправить это было легков этот момент мне просто пришлось немного изменить код, начиная с этого момента:

public function index()
{
    $invoices_egp = auth()->user()->invoices()->where(['paid' => 1, 'currency' => 'EGP'])->latest()->get();
    $invoices_usd = auth()->user()->invoices()->where(['paid' => 1, 'currency' => 'USD'])->latest()->get();
    $orders = \App\Order::where('vendor_id', auth()->user()->id)->where('paid', 1)->latest()->get();

    $egp_invoices_dates = $invoices_egp->map(function($invoice) { return Carbon::parse($invoice->paid_at)->format('Y-m'); })->unique();
    $usd_invoices_dates = $invoices_usd->map(function($invoice) { return Carbon::parse($invoice->paid_at)->format('Y-m'); })->unique();
    $orders_dates = $orders->map(function($order) { return Carbon::parse($order->paid_at)->format('Y-m'); })->unique();

    $dates = $orders_dates->merge($usd_invoices_dates)->merge($egp_invoices_dates)->unique();

    return view('dashboard.vendor.reports.index', compact('invoices_egp', 'invoices_usd', 'orders', 'dates'));
}

И в представлении мне просто нужно было изменить запросы на фильтрацию, чтобы они были такими для всех 3 запросов:

<td>{{ $invoices_egp->filter(function($invoice) use ($date) { return $invoice->created_at->year == \Carbon\Carbon::parse($date)->year; })->filter(function($invoice) use ($date) { return $invoice->created_at->month == \Carbon\Carbon::parse($date)->month; })->sum('total') }} EGP</td>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...