[英]updateOrCreate Laravel Eloquent inside a foreach issue?
所以我试图在foreach
语句中使用updateOrCreate
方法,但是它正在创建重复的新模型,而不是更新现有模型。
这是我的控制器的一部分:
$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
类的内容,然后创建重复项而不是更新行) 。
在此先感谢您的时间。
好的,所以我发现了错误,并且在我的模型上...对不起,我问,但是无论如何,对于有此问题的任何人。
我的模型是:
<?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
];
}
但是我忘了在我的$ updateOrCreate
添加'status'
,而且状态在我的表中默认值为0,所以当updateOrCreate
检查模型是否存在时,从未发现,因为新创建的行具有'status'
默认设置为零,并且该列未在模型的$ fillable中列出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.