如何使用查询生成器向 created_at 字段插入值

Posted

技术标签:

【中文标题】如何使用查询生成器向 created_at 字段插入值【英文标题】:How to insert a value to created_at field using Query Builder 【发布时间】:2018-06-09 18:06:41 【问题描述】:

我是 Laravel 的新手。我正在寻找一种在将行插入数据库表时自动向特定字段(例如 created_at)插入值的方法。

我发现只有 Eloquent 使用 some Model->save() 的方式将时间戳插入到所需的字段。

但我希望即使在使用 QueryBuilder 时也能够插入值。有什么办法吗?

我看过这个帖子:Query builder not inserting timestamps

任何建议将不胜感激。

提前谢谢你

【问题讨论】:

你想达到什么目的? 为什么不在数据库中设置触发器呢? 【参考方案1】:

你有said before 你正在使用Model::insertGetId(),但问题是这个方法没有使用 Eloquent。这是一个查询生成器方法。所以,请改用create()

$object = Model::create($data);
$id = $object->id;

如果您仍想使用insertGetId(),则需要手动添加created_at 时间戳:

$data['created_at'] = now();
Model::insertGetId($data);

或者您可以将CURRENT_TIMESTAMP 设置为时间戳列的默认值,但最好只使用 Eloquent 来处理。

【讨论】:

$data['created_at'] = now();【参考方案2】:

你可以在 helpers.php 中创建一个新的辅助方法 像这样的:

public function queryBuilderInsert($table, $data, $deleted_at = false)
    
        $data['created_at'] = \Carbon::now();
        $data['updated_at'] = \Carbon::now();
        $deleted_at ? $data['deleted_at'] = null :;

        \DB::table($table)->insert($data);
    
public function queryBuilderUpdate($builder, $data)
    
        $data['updated_at'] = \Carbon::now();
        $builder->update($data);
    

然后你可以像这样构建你的查询:

对于insert 使用queryBuilderInsert 方法

$example_data = [
    'name' => 'Name',
    'email'=> 'Email'
];
queryBuilderInsert('users',$example_data);

如果你在你的表上使用软删除,你可以使用queryBuilderInsert的第三个参数

queryBuilderInsert('users',$example_data, true);

对于update,您可以进行查询,然后调用queryBuilderUpdate方法

$example_update_data = [
    'name' => 'Name',
    'email'=> 'Email'
];
$builder = \DB::table('users')->where('id',1);
queryBuilderUpdate($builder,$example_update_data);

它将设置updated_at日期并进行更新

【讨论】:

以上是关于如何使用查询生成器向 created_at 字段插入值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用格式化的日期时间字段获取 django 查询集结果

如何将 created_at 字段值从 Instagram 媒体对象转换为日期

如何将此 sql 查询转换为 laravel 查询生成器

如何使用 `created_at` 列获取最新数据

在 Eloquent ORM 中向模型添加字段

YII2如何使用查询生成器更新字段