当前位置: 首页 > 知识库问答 >
问题:

Laravel:使用查询生成器或雄辩的ORM时,在每次插入/更新时执行一些任务

宿景曜
2023-03-14

我想自动将创建人修改人字段添加到Laravel 4中数据库表的每次插入/更新中,无论我使用的是Eloquent还是Query Builder。但是,并非所有表都有这些字段,因此任何解决方案都必须在添加之前检查这些列是否存在。

我已经扩展了类,并编写了一个覆盖方法,以便为保存的每个记录添加一些额外的元数据字段。

这很好,只是如果我使用查询生成器执行插入,那么这将被忽略。查看模型类,似乎数据库操作实际上是使用查询生成器完成的。

我已经看了一下照明\数据库\查询\生成器模型,看起来我可能可以为插入()更新()编写覆盖方法。

这是一种为每次插入/更新执行某些任务的明智方法,还是以后我会遇到麻烦?

共有3个答案

韶硕
2023-03-14

在Laravel中,如果您希望在每次保存/更新时从单个点调用单个方法,而不在每个扩展模型中进行任何其他更改,则可以为有说服力的事件使用自定义侦听器。正如文件所述,这只能针对每个型号进行。但创建自定义侦听器允许访问任何模型中的任何事件。

只需在下面的EventServiceProvider中的start()方法中添加一个侦听器,并相应地进行修改。

Event::listen(['eloquent.saving: *', 'eloquent.creating: *'], function(){
        //your method content
        //returning false will cancel saving the model
 });

请注意,通配符用于匹配任何模型。有关事件的更多信息,请参阅留档。

澹台鸿光
2023-03-14

决不能重写save方法来重写和添加函数性。

相反,您必须使用eloquent提供的模型事件功能来实现这一点。

简单地说,您必须为您的模型定义一个保存事件,以覆盖/设置/检查模型将要保存的数据。

将一个简单示例放入用户模型类:

//Executed when loading model
public static function boot()
{
     parent::boot();

     User::creating(function($user){
         $user->value1 = $user->value2 +1;
     });
}

更多信息:http://four.laravel.com/docs/eloquent#model-事件

王磊
2023-03-14

补充上述答案。你可以这样做。

在应用程序/模型中创建一个名为BaseModel的类。php扩展\雄辩

class BaseModel extends \Eloquent{

public static function boot()
{
    parent::boot();

    static::creating(function($model)
    {
        //change to Auth::user() if you are using the default auth provider
        $user = Confide::user();
        $model->created_by = $user->id;
        $model->updated_by = $user->id;
    });

    static::updating(function($model)
    {
        //change to Auth::user() if you are using the default auth provider
        $user = Confide::user();
        $model->updated_by = $user->id;
    });
  }

}

然后在您的单个模型类中,您需要扩展BaseModel而不是\Eloquent

class Product extends BaseModel {

    protected $table = 'product';

    //Booting the base model to add created_by and updated_by to all tables
    public static function boot()
    {
        parent::boot();
    }

}

现在,无论何时保存或更新模型,“创建人”和“更新人”字段都将自动更新。

注意:这只在通过雄辩完成保存或更新时有效。对于查询生成器,您可以有一个通用方法来获取和追加created_by和update_by列更新。

 类似资料:
  • 在有说服力的ORM上,是否有一种较短的方法在Laravel中插入数据? 目前我正在这样做: 就像你看到的,所有的列都像属性一样命名。 我知道您可以将对象与all()函数和fetch()一起使用。但是我从另一个对象(soap服务器)获取数据。 有没有办法转换这个?也许在模型上?

  • 使用Laravel的雄辩模型,我如何在访问对象时更新对象的数据,如果它已经 我有另一个API,我想确保数据是半最新的,但想缓存在我的数据库中的数据,而不是调用他们的API每次页面加载。 是否有Laravel在每次加载模型时调用的函数,我可以检查30天是否已经过去,调用API加载新数据,然后保存它?

  • 如何使用雄辩的ORM在Laravel中执行批量数据库插入? 我想在拉威尔完成这一点:https://stackoverflow.com/a/10615821/600516 但是我得到了以下错误。 SQLSTATE[HY093]:无效参数编号:混合命名参数和位置参数。

  • 如何使用laravel雄辩的ORM关系在多个表中发出一个插入请求。即 表1:用户 id 姓名 电子邮件 表2:员额 id 表3:图像 id 用户id 邮政id 图像名称 关系 表id引用了其他两个表中的 表与

  • 假设我们正在使用Laravel的查询生成器: 我正在寻找一个等效的SQL: 当我必须键入大量select和WHERE(或者通常在select的列alias中包含别名,并且它在结果数组中使用)时,这将特别有用。如果没有任何表别名,我需要输入更多的内容,所有内容的可读性都会降低。在laravel文档中找不到答案,有什么想法吗?

  • 问题内容: 我们如何使用雄辩的ORM在Laravel中执行批量数据库插入? 问题答案: 您可以使用。 例如: