显式定义 $guarded=['id'] 以防止意外插入?

Explicitly define $guarded=['id'] to prevent accidental insert?

假设我想将以下逻辑应用于我的所有模型 class:

All Model class with auto incremental id should have protected $guarded = ['id']

这样我就不会自己不小心插入增量id了。

在 Laravel 5 中有意义吗?
除了在每个模型 class 中设置 protected $guarded = ['id'] 之外,我还有其他方法可以实现吗?

是的,这样做还是有道理的。虽然ID默认是不可填的,但是直接修改$model->id = $id;

还是可以覆盖的

更好的方法是为所有模型定义一个基础 class 并在那里设置 $guarded 属性。这样你只需要这样做一次。

//Model.php
<?php namespace Your\Model\Namespace;

use Illuminate\Database\Eloquent\Model as Eloquent;

class Model extends Eloquent {
  protected $guarded = ['id'];
}


//SomeModel.php
<?php namespace Your\Model\Namespace;

class SomeModel extends Model {}

如果您遵循已接受的答案,您仍然可以 手动设置 id,实际上,我会说该答案会使您的应用程序的安全性更差。

Laravel 已经默认保护所有内容:

protected $guarded = ['*'];

因此,当 已经 受保护时,无需指定 id。当您覆盖 属性 时,您是在告诉 Laravel、"Actually, don't guard everything. Only guard the properties that I specify." 因此,从本质上讲,您是在解除对其他属性的保护。

此外,如果您要像这样手动分配属性:

$model = new Model;
$model->id = 1;
$model->name = 'Example';
$model->save();

$guarded / $fillable 属性永远不会生效。它们会在您使用 createupdatefill 等方法时生效。