如何在雄辩的ORM中禁止插入,更新和删除模型

时间:2019-02-25 20:29:20

标签: php eloquent

我有一个这样的模型:

class Foo extends Model
{
    protected $table = 'legacy_foo_table';
    protected $primaryKey = 'cod_foo';
}

在我的用例中,我不能删除,插入或更新数据库中的数据。我希望我的模型阻止应用程序中的这些操作。我不能将表更改为只读,也不能创建视图,也不能将数据库连接更改为只读。

那么,在保留Eloquent的查询和对象关系映射的同时,如何在不更改数据库的情况下禁止在数据库中更改软件?如果尝试更改时抛出异常,那就更好了。

2 个答案:

答案 0 :(得分:2)

您说您不能更改表本身上的任何内容,但是可以创建一个具有对该表的只读访问权限的新用户吗?如果可能的话,那将是最好的路线。否则,您可以更新模型以限制这些方法。

您可以覆盖更新保存和删除方法以引发异常。在模型上添加:

public function update(array $attributes = [], array $options = [])
{
    throw new \Exception('Updates are not allowed');
}

public function save(array $options = [])
{
    throw new \Exception('Updates are not allowed');
}

public function delete()
{
    throw new \Exception('Deleting is not allowed');
}

这将阻止您在模型的实例上执行这些方法,因此执行此类操作将导致异常。

$model->update(['attribute' => 'new value']);
$model->delete();

$model->attribute = 'new value';
$model->save();

这不会阻止您使用查询生成器更新表。因此,您仍然可以这样做:

Foo::where('condition', '=', 'test')->update(['attribute' => 'new value']);

要阻止此操作,您需要实施自定义查询生成器,这将花费更多的精力。

答案 1 :(得分:1)

您可以创建类似example

的特征
class User extends Model {
  use ReadOnlyTrait;
}