我是Laravel的新手。我正在寻找一种方法,只要将行插入数据库表,就会自动将值插入特定字段,例如created_at
。
我发现只有使用Eloquent
的some Model->save()
方式将时间戳插入所需的字段。
但是我希望即使在使用QueryBuilder时也能插入一个值。有没有办法这样做?
我看过这篇文章:Query builder not inserting timestamps
任何意见,将不胜感激。
先感谢您
你有said before你正在使用Model::insertGetId()
,但问题是这种方法不使用Eloquent。这是一个Query Builder方法。所以,使用create()
代替:
$object = Model::create($data);
$id = $object->id;
如果您仍想使用insertGetId()
,则需要手动添加created_at
时间戳:
$data['created_at'] = now();
Model::insertGetId($data);
或者您可以将CURRENT_TIMESTAMP
设置为timestamp列的默认值,但使用Eloquent来处理此问题要好得多。
您可以在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
日期并进行更新