[英]Why is laravel's updateOrCreate creating new records instead of updating?
代码
Entry::updateOrCreate([
'intern_id'=>$intern['id'],
'created_at'=>Carbon::parse($input['date'])
],[
'company_id'=>$intern['supervisor']['company']['id'],
'content'=>$input['text']
]);
我正在使用此代码尝试更新/创建新记录。 假设首先匹配intern_id
和create_at
列。 如果找到,那么它会创建一个新的。 但是,它似乎总是在创建一个新的,当它创建一个新的时, company_id
和intern_id
列设置为 0 而不是原始值。
注意: intern_id
或created_at
不是 PK 列。 注2: created_at
是 Date 类型,而不是 DateTime
使用此代码
Entry::updateOrCreate(['intern_id'=>$intern['id']],
[
'created_at'=>Carbon::parse($input['date']),
'company_id'=> $intern['supervisor']['company']['id'],
'content'=>$input['text']
]);
我相信这会奏效。
模型抽象类的updateOrCreate()
函数需要 2 个参数,但是您的参数传递会中断。
/**
* Create or update a record matching the attributes, and fill it with values.
*
* @param array $attributes
* @param array $values
* @return static
*/
public static function updateOrCreate(array $attributes, array $values = array())
{
$instance = static::firstOrNew($attributes);
$instance->fill($values)->save();
return $instance;
}
Entry::updateOrCreate(
[
'intern_id' => $intern['id'],
],
[
'created_at' => Carbon::parse($input['date'])
'company_id' => $intern['supervisor']['company']['id'],
'content' => $input['text']
]
);
因为第一次搜索的第一个参数数组找到了带有日期的一行,而第二行找到了其他日期延迟-----------
// 如果有从奥克兰到圣地亚哥的航班,请将价格设置为 99 美元。 // 如果不存在匹配的模型,则创建一个。
$flight = App\Flight::updateOrCreate(
['departure' => 'Oakland', 'destination' => 'San Diego'],
['price' => 99]
);
我遇到了同样的问题,它只是创建了一条记录,但如果记录存在,它就不会被更新。
问题是,为了允许对更新进行批量分配,您需要将要更新的字段添加为模型中的可填充字段。
在您的Entry模型中,您可以拥有接近此的东西:
protected $fillable = [
'company_id',
'content',
];
我希望这有助于解决问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.