繁体   English   中英

为什么 laravel 的 updateOrCreate 是创建新记录而不是更新?

[英]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_idcreate_at列。 如果找到,那么它会创建一个新的。 但是,它似乎总是在创建一个新的,当它创建一个新的时, company_idintern_id列设置为 0 而不是原始值。

注意: intern_idcreated_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM