laravel Maatwebsite проверить сумму мульти столбец - PullRequest
2 голосов
/ 21 апреля 2020

привет, я использую Maatwebsite с laravel пока все работает так хорошо ... но я хочу обновить Excel, как это ..

number      date            amount
1           2020-01-01      10
1           2020-01-01      -5
1           2020-01-01      -5
2           2020-02-02      20
2           2020-02-02      -20
3           2020-03-03      50  
3           2020-03-03      -50
3           2020-03-03      40
3           2020-03-03      -40

что я хочу, это сумма суммы с номером 1 может вернуть 0 или завершить импорт

number      date            amount
1           2020-01-01      10
1           2020-01-01      -5
1           2020-01-01      -5

как я могу проверить это (10 + -5 + -5 == 0) или потерпеть неудачу и для 2 и 3 и т. д.

спасибо много

1 Ответ

1 голос
/ 25 апреля 2020

Я объяснил все шаги в комментариях, но я объясню и здесь.

Когда вы пропускаете oop через каждую строку, вам сначала нужно захватить все строки, где поле number равно 1, 2 или 3, какое бы число ни находилось в данный момент в итерации.

В этом случае первые результаты l oop будут:

number      date            amount
1           2020-01-01      10
1           2020-01-01      -5
1           2020-01-01      -5

Тогда Вы суммируете (суммируете) значения из столбца amount.

В этом случае оно будет суммироваться следующим образом:

10
-5
-5
-----
0

Если ответом является , а не 0, возьмите текущий лист ($sheet) и верните то, что у вас есть, для экспорта.


Полный класс:

...
use Maatwebsite\Excel\Concerns\FromArray;

class ExampleExport implements FromArray
{
    public function array() : array
    {
        // EXAMPLE hardcoded data for the purpose of this demo
        $rows = [
            [
                'number' => 1,
                'date' => '2020-01-01',
                'amount' => 10
            ],
            [
                'number' => 1,
                'date' => '2020-01-01',
                'amount' => -5
            ],
            [
                'number' => 1,
                'date' => '2020-01-01',
                'amount' => -5
            ],
            [
                'number' => 2,
                'date' => '2020-02-02',
                'amount' => 20
            ],
            [
                'number' => 2,
                'date' => '2020-02-02',
                'amount' => -20 // <-------- Change this to -21 to test
            ],
            [
                'number' => 3,
                'date' => '2020-03-03',
                'amount' => 50
            ],
            [
                'number' => 3,
                'date' => '2020-03-03',
                'amount' => -50
            ],
            [
                'number' => 3,
                'date' => '2020-03-03',
                'amount' => 40
            ],
            [
                'number' => 3,
                'date' => '2020-03-03',
                'amount' => -40
            ],
        ];

        // EXAMPLE hardcoded data for the purpose of this demo
        $rows = collect($rows);

        // You probably going to get this from your database so should look like this:
        // $rows = \App\Model::all(['number', 'date', 'amount']); // OR below
        // $rows = DB::table('examples')->select(['number', 'date', 'amount'])->get();

        // Blank sheet
        $sheet = [];

        foreach ($rows as $row) {
            // Get all the rows where the `number` field has the same value,
            // for example 1, 2, or 3, then sum the `amount` field (add up).
            //
            // If the amount does not add up to 0, stop and return what you currently got
            if ($rows->where('number', $row['number'])->sum('amount') !== 0) {
                return $sheet;
            }

            // Else, add them to the sheet and continue.
            $sheet[] = $row;
        }

        return $sheet;
    }
}

Результаты:

Когда amount складывается до 0:

Successful results

Когда amount не складывается до 0:

Unsuccessful results

...