【问题标题】:How to get rid of "Does not have a default value" in Laravel?如何摆脱 Laravel 中的“没有默认值”?
【发布时间】:2021-02-09 18:53:16
【问题描述】:

我有一个错误:

doesnt have a default value (SQL: insert into `news` (`updated_at`, `created_at`) values (2021-02-09 18:45:57, 2021-02-09 18:45:57))

我读到,当您尝试插入 NULL 值时会出现此错误,但对我来说最奇怪的部分是,尽管出现错误,它仍然将此数据保存在 DB 中(具有正确创建、更新的字段)。 这是控制器中的代码:

public function addArticle(Request $request)
{
    $data = $request->json()->all();
    $news = new News;

    $news->insert([
        'title' => $data['title'],
        'content' => $data['content'],
        'photo' => $data['photo'],
        'author' => 1,
        "created_at"=> now(),
        "updated_at"=> now(),
    ]);

    $news->save();

}

【问题讨论】:

  • 您不会“摆脱”这个问题,而是要解决它。在架构中设置一个默认值,或者在调用insert() 时设置一个值。无论哪种方式。
  • 您可以在数据库模式中将列的默认值设置为NULL

标签: mysql sql laravel timestamp


【解决方案1】:

您正在尝试使用雄辩的模型“新闻”在数据库中创建一个新对象。在$news = new News;你实例化一个对象而不将参数传递给构造函数。之后,您尝试插入该数据。我猜这个异常发生在第 4 行。

试试这样的

$news = new \App\Models\News([
    'title' => $data['title'],
    'content' => $data['content'],
    'photo' => $data['photo'],
    'author' => 1,
    "created_at"=> now(),
    "updated_at"=> now(),
]);

$news->save();

或

$isCreated = \App\Models\News::create([
    'title' => $data['title'],
    'content' => $data['content'],
    'photo' => $data['photo'],
    'author' => 1,
    "created_at"=> now(),
    "updated_at"=> now(),
]);

【讨论】:

    【解决方案2】:
    public function addArticle(Request $request)
    {
        $data = $request->json()->all();
        $news = new News;
    
        $news->insert([
            'title' => $data['title'],
            'content' => $data['content'],
            'photo' => $data['photo'],
            'author' => 1,
            "created_at"=> now(),
            "updated_at"=> now(),
        ]);
    
        $news->save();
    
    }
    

    查看您的代码,我发现您在两个实例中保存数据。首先,您使用的是 insert() 方法,该方法接受有效负载并将数据插入到您的表中。这一步也不例外。

    当您调用 $news->save() 时会引发异常,因为 save 试图存储 $news 对象,该对象没有为属性填充,因此试图保存一个空白对象。这是抛出异常。

    如果您使用的是 save ,您只需要填充属性,其余的都将通过 save 完成。保存 eloquent 对象还可以帮助您将创建和更新设置为 now()。

    我将更新此代码如下:

    • 在新闻模型中创建可填充(如果字段映射正确)

      protected $fillable = ['title', 'content', 'photo', 'author'];
      
    • 将在 addArticle 中使用批量赋值。

       public function addArticle(Request $request)
       {
           $data = $request->only('title', 'content', 'photo', 'author);
           //update author if source of data is other than request payload
           $data['author'] = 1
      
           $news = News::create($data);        
           // return response as required. 
       }
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      • 2017-04-10
      相关资源
      最近更新 更多