updateOrCreate Laravel Eloquent внутри проблемы foreach? - PullRequest
0 голосов
/ 20 мая 2018

, поэтому я пытаюсь использовать updateOrCreate Eloquent Method внутри оператора foreach, но он создает дублированные новые модели вместо обновления существующих.

Вот часть моего контроллера:

$user = Auth::user()->id;

    $providers = Providers::where('user_id', $user)->where('provider_status', 0)->get(['provider_id']);

    //dd($providers);

    //Months

    $now = Carbon::now()->setTimezone('America/Costa_Rica');;

    $currentYear = $now->copy()->year;

    foreach($providers as $provider) {

        //January

        //Month
        $janFrom = $now->copy()->month(1)->startOfMonth();
        $janTo = $now->copy()->month(1)->endOfMonth();

        $janPriceMonthTotal = Planillas::where('user_id', $user)->where('status', 0)->where('deleted', 0)->where('provider', $provider->provider_id)->whereBetween('date', [$janFrom, $janTo])->sum('price');

        //Fortnights
        //First
        $janFromFortnightFirst = $janFrom->copy();
        $janToFortnightFirst = $janFromFortnightFirst->copy()->addDays(14);

        $janPriceFortnightFirst = Planillas::where('user_id', $user)->where('status', 0)->where('deleted', 0)->where('provider', $provider->provider_id)->whereBetween('date', [$janFromFortnightFirst, $janToFortnightFirst])->sum('price');
        $janExpensesFortnightFirst = Planillas::where('user_id', $user)->where('status', 0)->where('deleted', 0)->where('provider', $provider->provider_id)->whereBetween('date', [$janFromFortnightFirst, $janToFortnightFirst])->sum('travel_expenses');

        //Last
        $janFromFortnightLast = $janFromFortnightFirst->copy()->addDays(15);
        $janToFortnightLast = $janTo->copy();

        $janPriceFortnightLast = Planillas::where('user_id', $user)->where('status', 0)->where('deleted', 0)->where('provider', $provider->provider_id)->whereBetween('date', [$janFromFortnightLast, $janToFortnightLast])->sum('price');
        $janExpensesFortnightLast = Planillas::where('user_id', $user)->where('status', 0)->where('deleted', 0)->where('provider', $provider->provider_id)->whereBetween('date', [$janFromFortnightLast, $janToFortnightLast])->sum('travel_expenses');

        $janEventCount = Planillas::where('user_id', $user)->where('status', 0)->where('deleted', 0)->where('provider', $provider->provider_id)->whereBetween('date', [$janFrom, $janTo])->count();

        //dd($janEventCount);
        //Update if exists or create if doesn't
        $janMonth = ProviderReport::updateOrCreate([
            'user_id' => $user,
            'status' => 1,
            'month' => 'jan',
            'year' => $currentYear,
            'provider_id' => $provider->provider_id,
        ],
            [
                'monthly_total' => $janPriceMonthTotal,
                'first_fortnight' => $janPriceFortnightFirst,
                'second_fortnight' => $janPriceFortnightLast,
                'expenses_first' => $janExpensesFortnightFirst,
                'expenses_last' => $janExpensesFortnightLast,
                'event_count' => $janEventCount,
            ]);
    }

Моя модель здесь:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class ProviderReport extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'user_id',
        'month',
        'year',
        'first_fortnight',
        'second_fortnight',
        'monthly_total',
        'expenses_first',
        'expenses_last',
        'provider_id',
        'event_count',
    ];
}

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

Заранее спасибо за ваше время.

1 Ответ

0 голосов
/ 20 мая 2018

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

Моя модель:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class ProviderReport extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'user_id',
        'month',
        'year',
        'first_fortnight',
        'second_fortnight',
        'monthly_total',
        'expenses_first',
        'expenses_last',
        'provider_id',
        'event_count',
    ];
}

Исправлено:

<?php

    namespace App;

    use Illuminate\Database\Eloquent\Model;

    class ProviderReport extends Model
    {
        /**
         * The attributes that are mass assignable.
         *
         * @var array
         */
        protected $fillable = [
            'user_id',
            'month',
            'year',
            'first_fortnight',
            'second_fortnight',
            'monthly_total',
            'expenses_first',
            'expenses_last',
            'provider_id',
            'event_count',
            'status', // i forgot to add this
        ];
    }

, но я забыл добавить 'status' к моему $ fillable. Кроме того, для состояния в моей таблице по умолчанию было установлено значение 0, поэтому, когда updateOrCreate проверял наличие моей модели,не был найден, потому что для вновь созданных строк 'status' был установлен по умолчанию на ноль, и этот столбец не был указан в $ fillable в модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...