常规错误:1364字段'user_id'没有默认值

时间:2017-04-27 07:38:00

标签: laravel

我正在尝试为user_id分配当前用户,但它给了我这个错误

SQLSTATE[HY000]: General error: 1364 Field 'user_id' doesn't have a 
default value (SQL: insert into `posts` (`updated_at`, `created_at`) 
values (2017-04-27 10:29:59, 2017-04-27 10:29:59))

这是我的方法

//PostController
Post::create(request([
        'body' => request('body'),
        'title' => request('title'),
        'user_id' => auth()->id()
    ]));

使用这些填充

//Post Model
protected $fillable = ['title', 'body', 'user_id']

然而,这种方法可以完成工作

//PostController
auth()->user()->publish(new Post(request(['title' ,'body']))); 

//Post Model
public function publish(Post $post)
{
    $this->posts()->save($post);
}

知道为什么会失败吗? enter image description here

16 个答案:

答案 0 :(得分:14)

所以,在再次检查代码之后,我发现了错误。 我想知道没有人注意到这一点! 在上面的代码我写了

Post::create(request([  <= the error is Here!!!
    'body' => request('body'),
    'title' => request('title'),
    'user_id' => auth()->id()
]));

实际上,请求函数不需要扭曲创建函数的主体。

// this is right
Post::create([
    'body' => request('body'),
    'title' => request('title'),
    'user_id' => auth()->id()
]);

答案 1 :(得分:9)

您需要更改数据库严格模式。禁用按照以下步骤

  1. 打开database.php

  2. 查找'strict'将值true更改为false,然后重试

答案 2 :(得分:4)

以下是我的表现:

这是我的PostsController

Post::create([

    'title' => request('title'),
    'body' => request('body'),
    'user_id' => auth()->id() 
]);

这是我的帖子模型。

protected $fillable = ['title', 'body','user_id'];

如果只是在测试实例

上,请尝试刷新迁移
$ php artisan migrate:refresh

注意:migrate:refresh将删除所有以前的帖子,用户

答案 3 :(得分:2)

尝试

'user_id' => auth()->id

'user_id' => Auth::user()->id

而不是

'user_id' => auth()->id()

答案 4 :(得分:2)

我今天在用户注册时遇到了类似的问题,而且我得到了一个

SQLSTATE[HY000]: General error: 1364 Field 'password' doesn't have a default value (SQL: insert into `users`

我通过将password添加到受保护的$ fillable数组来修复它,并且它可以正常工作

protected $fillable = [ 'name', 'email', 'password', ];

我希望这会有所帮助。

答案 5 :(得分:1)

尝试<table> <thead> <tr> <th>Header tableData</th> <th>Header tableData</th> <th>Header tableData</th> <th>Header tableData</th> <th>Header tableData</th> </tr> </thead> <tbody id="append"> </tbody> </table> ,例如

    window.addEventListener("load",function(){

        if(typeof sessionStorage.firstrows=='undefined'){
            sessionStorage.firstrows=0; //first
        }else{
            sessionStorage.firstrows=0;
        }
        if(typeof sessionStorage.lastrows=='undefined'){
            sessionStorage.lastrows=100; //LIMIT
        }else{
            sessionStorage.lastrows=100;//LIMIT
        }

        viewdata(sessionStorage.firstrows,sessionStorage.lastrows);

        window.onscroll = function(ev) {
            if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight) {
                viewdata(sessionStorage.firstrows,sessionStorage.lastrows);
            }
        };

        function viewdata(firstrows,lastrows){  

            //##### AJAX HERE


           //---- Do pull the data already in the Limit ----


            //##### END AJAX 

           //## Callback function from ajax
            var count_row = 5000; //Amount of data
            var tbody = document.getElementById('append');

            if(lastrows > count_row){
                last_= count_row;
            }else{
                last_= lastrows;
                alert("Append New Row ("+sessionStorage.firstrows+" To "+sessionStorage.lastrows+")");
            }
            for (key =firstrows;key<last_;key++) {
                var tr = document.createElement('tr');
                var html = "";
                    tr.setAttribute("class", 'tableRow');
                    html += "<td class='tableData'>"+key+"</td>";
                    html += "<td class='tableData'>b</td>";
                    html += "<td class='tableData'>c</td>";
                    html += "<td class='tableData'>d</td>";
                    html += "<td class='tableData'>e</td>";
                tr.innerHTML = html;
                tbody.appendChild(tr); //append to tbody
            }
            if(lastrows > count_row){
                alert("END");
            }else{
                sessionStorage.firstrows = last_;
                sessionStorage.lastrows = (parseInt(last_)+100);
            }
        }
    });

还要记住在控制器顶部包含Auth外观,Auth::id()

答案 6 :(得分:1)

使用print_r(Auth);

然后看看你有user_id / id变量的格式并使用它

答案 7 :(得分:1)

用户Auth::user()->id代替。

这是正确的方法:

//PostController
Post::create(request([
    'body' => request('body'),
    'title' => request('title'),
    'user_id' => Auth::user()->id
]));

如果您的用户已通过身份验证,则Auth::user()->id即可完成此操作。

答案 8 :(得分:1)

这个问题有两种解决方案。

首先,创建具有在datatable中设置的默认值的字段。它可能是空字符串,这对于在严格模式下运行的MySQL服务器来说很好。

其次,如果你刚刚开始得到这个错误,那么在MySQL / MariaDB升级之后,就像我一样,如果你已经有很多需要修复的大型项目,你需要做的就是编辑MySQL / MariaDB配置文件(例如/etc/my.cnf)并禁用表的严格模式:

[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION

由于默认情况下启用了新的严格模式,此错误最近才开始发生。从STRICT_TRANS_TABLES配置密钥中删除sql_mode,使其像以前一样工作。

答案 9 :(得分:0)

这似乎是您数据库结构中的缺陷。保持标题和正文列的默认值为无。

试试这个:

$user_login_id = auth()->id();
Post::create(request([
        'body' => request('body'),
        'title' => request('title'),
        'user_id' => $user_login_id
    ]));

答案 10 :(得分:0)

就我而言,错误是因为我没有在模型中的$ fillable数组中声明该字段。嗯,它似乎是基本的东西,但对于我们从laravel开始它可以工作。

答案 11 :(得分:0)

 Post::create([
      'title' => request('title'),
      'body' => request('body'),
      'user_id' => auth()->id()
    ]);`enter code here`

您不需要request()时已经提取了body和title的值

答案 12 :(得分:0)

在Laravel中使用数据库列nullble()。您可以在数据库中选择默认值或可为空的值。

答案 13 :(得分:0)

上述错误可能是由于视图表单中的输入变量名称错误导致的,由于未提供任何变量,因此求助于默认值-SQLSTATE [HY000]:常规错误:1364字段“ user_id”没有没有 默认值(SQL:插入postsupdated_atcreated_at) 值(2017-04-27 10:29:59,2017-04-27 10:29:59))

答案 14 :(得分:0)

$table->date('user_id')->nullable();

在文件create_file中,必须启用null选项。

答案 15 :(得分:-1)

删除request()方法。它看起来像。

    Post::create([
      'body' => request('body'),
      'title' => request('title'),
      'user_id' => auth()->id()
    ]);