【问题标题】:Laravel seeding results in Null timestampLaravel 播种导致 Null 时间戳
【发布时间】:2017-07-27 04:04:45
【问题描述】:

所以我有一个 Languages Table (LanguageTableSeeder) 的播种机,如下所示:

DB::table('languages')->insert([
    'name'        => 'English',
    'flag'        => '',
    'abbr'        => 'en',
    'script'    => 'Latn',
    'native'    => 'English',
    'active'    => '1',
    'default'    => '1',
]);

    $this->command->info('Language seeding successful.');

但这导致created_atupdated_at 字段在数据库中为空。我查看了预发布的 UsersTabeSeeder 并将我的 LanguageTableSeeder 更改为完全相同的格式:

DB::table('languages')->delete();

$languages = [
    [
        'name' => 'English',
        'flag' => '',
        'abbr' => 'en',
        'script' => 'Latn',
        'native' => 'English',
        'active' => '1',
        'default' => '1',
    ],
];

foreach ($languages as $language){
    Language::create($language);
}

这也导致 created_atupdated_at 字段为 Null,这很奇怪,因为当我查看数据库中的用户表时,他们有 created_atupdated_at 字段要在确切时间设置运行播种机。

所以这是我的问题。为什么会这样?是否有必要使用:

'created_at' => date("Y-m-d H:i:s"),
'updated_at' => date("Y-m-d H:i:s"),

在播种时获得填充时间戳?

【问题讨论】:

    标签: laravel eloquent laravel-5.4 laravel-seeding


    【解决方案1】:

    自动时间戳保存仅适用于 Eloquent 功能,因此对于非 eloquent 功能,您需要手动执行如下操作

    DB::table('languages')->insert([
        'name'        => 'English',
        'flag'        => '',
        'abbr'        => 'en',
        'script'    => 'Latn',
        'native'    => 'English',
        'active'    => '1',
        'default'    => '1',
        'created_at' => Carbon::now()->format('Y-m-d H:i:s'),
        'updated_at' => Carbon::now()->format('Y-m-d H:i:s')
    
    ]);
    

    或者雄辩地去做(就像你在像 UserTableSeeder 这样的自动生成的种子中看到的那样)

        $language = new Language();
        $language ->name = 'English';
        $language->flag'  = '',
        $language ->abbr  = 'en',
        $language->script ='Latn',
        $language->native ='English',
        $language->active ='1',
        $language->default ='1',
        $language->save();
    

    为什么要使用碳? Eloquent 为日期时间和时间戳列提供了 Carbon。默认情况下,它将为 created_at、updated_at 和 deleted_at 列提供 Carbon。您可以在扩展 Eloquent\Model 的模型中自定义它。

    Carbon\Carbon extends \DateTime,因此使用 Carbon 代替 DateTime 不会损失功能,只会带来更多好处/灵活性。

    【讨论】:

    • 感谢您的回复。为什么我应该使用Carbon 包而不是php 的date 函数?为什么UsersTableSeeder 设置时间戳而不使用上述任何方法?
    • 可能是您的用户表被雄辩地保存在种子上,如 $user = new User(); $user->name = '超级管理员'; $user->email = 'system@test.com'; $user->save();
    • 感谢您对我的启发@sumit :),我还不能投票,但我接受您的回答。虽然我理解你关于雄辩地保存数据的观点,但UsersTableSeeder 不这样做!这很奇怪,但我没有太多时间去调查它。也许以后? :)
    • 别忘了包含use Carbon\Carbon;
    【解决方案2】:

    在用户表播种器中为时间戳执行此操作。它对我有用..

        use Carbon\Carbon;
    
    
    
        $faker = Factory::create();
        $date = Carbon::now()->modify('-2 year');
        $createdDate = clone($date);
        DB::table('users')->insert([
    
            [
    
                'name' => "XYZ",
                'slug' => "xyz",
                'email' => "xyz@test.com",
                'password' => bcrypt('secret'),
                'bio' => $faker->text(rand(250, 300)),
                'created_at' => $createdDate,
                'updated_at' => $createdDate
    
            ],
    

    【讨论】:

      猜你喜欢
      • 2020-11-09
      • 2015-03-31
      • 2018-07-09
      • 2018-11-27
      • 1970-01-01
      • 2018-01-29
      • 2015-08-13
      • 1970-01-01
      • 2012-05-10
      相关资源
      最近更新 更多