【问题标题】:Laravel 5 insert works without $fillableLaravel 5 insert 无需 $fillable 即可工作
【发布时间】:2021-05-19 04:20:31
【问题描述】:

我有一个别人制作的 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 为空。

【问题讨论】:

    标签: mysql laravel-5 model fillable


    【解决方案1】:

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

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

    类似这样的:

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

    注意updateOrCreate 返回一个模型实例,updateOrInsert 返回一个boolean

    updateOrCreate

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

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

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

    updateOrInsert:

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

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

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

    【讨论】:

    • 你真是个天才,你怎么会知道这些事情。我阅读了很多关于 Laravel 的文档,但我没有找到。非常感谢
    猜你喜欢
    • 2016-04-29
    • 2018-04-02
    • 1970-01-01
    • 2019-08-19
    • 2017-10-20
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    相关资源
    最近更新 更多