首页 > 解决方案 > Laravel 5 insert 无需 $fillable 即可工作

问题描述

我有一个别人制作的 Laravel 应用程序。

在控制器中我有这个:

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Result;

class StoreInDB extends Controller
{
    function store($uuid, $session){
        // Insert data
        $r = new Result;
        if($r->updateOrInsert(['user_id' => $uuid], ['user_id' => $uuid, 'answers' => $session])){
            return true;
        }
        else{
            return false;
        }
    }
}

在模型结果中我有这个:

namespace App;

use Illuminate\Database\Eloquent\Model;

class Result extends Model
{
    //
}

为什么它有效?没有 $fillable 可以告诉您可以使用哪一列来插入。

数据被插入。但为什么?我唯一的问题是 created_at 和 updated_at 为空。

标签: mysqllaravel-5modelfillable

解决方案


updateOrInsert使用查询构建器而不是 eloquent,因此它不会触发模型事件或尊重guardedorfillable属性,也不会填充created_atandupdated_at列。

如果你想使用上面提到的 eloquent 特性,你应该使用updateOrCreate

像这样的东西:

public function store($uuid, $session)
{
    if (null === Result::updateOrCreate(['user_id' => $uuid], ['answers' => $session])) {
        return false;
    }

    return true;
}

请注意,它updateOrCreate返回一个模型实例并updateOrInsert返回一个boolean.

更新或创建

有时,如果不存在匹配的模型,您可能需要更新现有模型或创建新模型。和firstOrCreate方法一样,updateOrCreate方法持久化了模型,所以不需要手动调用save方法。

在下面的示例中,如果存在departure位置为Oaklanddestination位置的航班San Diego,则其pricediscounted列将被更新。如果不存在这样的航班,将创建一个新航班,该航班具有将第一个参数数组与第二个参数数组合并后的属性:

$flight = Flight::updateOrCreate(
    ['departure' => 'Oakland', 'destination' => 'San Diego'],
    ['price' => 99, 'discounted' => 1]
);

更新或插入:

有时您可能想要更新数据库中的现有记录,或者在不存在匹配记录时创建它。在这种情况下, updateOrInsert可以使用该方法。该updateOrInsert方法接受两个参数:查找记录的条件数组,以及指示要更新的列的列和值对数组。

updateOrInsert方法将尝试使用第一个参数的列和值对来定位匹配的数据库记录。如果记录存在,它将使用第二个参数中的值进行更新。如果找不到记录,将插入一条新记录,其中包含两个参数的合并属性:

DB::table('users')
    ->updateOrInsert(
        ['email' => 'john@example.com', 'name' => 'John'],
        ['votes' => '2']
    );

推荐阅读