Метод Laravel each () - PullRequest
       31

Метод Laravel each ()

0 голосов
/ 01 июля 2018

Я пытаюсь понять, почему следующее всегда возвращает ложь:

public function checkDate($transactions)
{
    $start = Carbon::now()->subMonth();
    $end = Carbon::now();

    $transactions->each(function ($transaction) use ($start, $end) {

        $date = Carbon::createFromFormat('Y-m-d', $transaction->date);

        if ($date->between($start, $end))
        {
            return true;
        }

        return false;
    });

    return false;
}

Когда я удаляю оба return false, отображается null.

Когда я использую обычный foreach, он работает:

$start = Carbon::now()->subMonth();
$end = Carbon::now();

foreach($transactions as $transaction)
    {
        $date = Carbon::createFromFormat('Y-m-d', $transaction->date);

        if($date->between($start, $end))
        {
            return true;
        }

        return false;
    }

Что я не понимаю, так это когда я делаю следующее:

public function checkDate($transactions)
{
    $start = Carbon::now()->subMonth();
    $end = Carbon::now();

    $transactions->each(function ($transaction) use ($start, $end) {

        $date = Carbon::createFromFormat('Y-m-d', $transaction->date);

        if ($date->between($start, $end))
        {
            dd('test');
            return true;
        }

        return false;
    });

    return false;
}

Затем отображается "test".

Может кто-нибудь объяснить, почему это происходит, поскольку я этого не понимаю.

1 Ответ

0 голосов
/ 01 июля 2018

Метод each не останавливает итерации, когда возвращается true. Однако он останавливается, когда возвращается false.

Если вы хотите прекратить перебирать элементы, вы можете вернуть false из вашего обратного вызова:

Методы сбора - каждый ()

Ваш метод возвращает только false.

Если вы пытаетесь проверить, все ли транзакции попадают в диапазон дат, используйте метод каждые :

// returns true if all transactions date are between start and end, otherwise returns false.
return $transactions->every(function ($transaction) use ($start, $end) {
    $date = Carbon::createFromFormat('Y-m-d', $transaction->date);

    return $date->between($start, $end);
});
...