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 为空。

解决方法

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

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

像这样:

updated_at

请注意,public function store($uuid,$session) { if (null === Result::updateOrCreate(['user_id' => $uuid],['answers' => $session])) { return false; } return true; } 返回一个模型实例,而 updateOrCreate 返回一个 updateOrInsert

updateOrCreate

有时,您可能需要更新现有模型或创建新模型 如果不存在匹配的模型,则模型。像 boolean 方法一样, firstOrCreate 方法会保留模型,因此无需 手动调用保存方法。

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

discounted

updateOrInsert:

有时您可能希望更新数据库中的现有记录或 如果不存在匹配的记录,则创建它。在这种情况下, 可以使用 $flight = Flight::updateOrCreate( ['departure' => 'Oakland','destination' => 'San Diego'],['price' => 99,'discounted' => 1] ); 方法。 updateOrInsert 方法 接受两个参数:一个条件数组,通过它可以找到 记录,以及指示列的列和值对数组 待更新。

updateOrInsert 方法将尝试定位匹配的数据库 使用第一个参数的列和值对记录。如果 记录存在,它将用第二个中的值更新 争论。如果找不到该记录,则会创建一条新记录 插入两个参数的合并属性:

updateOrInsert