我有一个这样的模型:
class Foo extends Model
{
protected $table = 'legacy_foo_table';
protected $primaryKey = 'cod_foo';
}
在我的用例中,我不能删除,插入或更新数据库中的数据。我希望我的模型阻止应用程序中的这些操作。我不能将表更改为只读,也不能创建视图,也不能将数据库连接更改为只读。
那么,在保留Eloquent的查询和对象关系映射的同时,如何在不更改数据库的情况下禁止在数据库中更改软件?如果尝试更改时抛出异常,那就更好了。
答案 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;
}