Общая ошибка: 1364 Поле 'user_id' не имеет значения по умолчанию

Я пытаюсь назначить 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

Ответ 1

Итак, после повторного просмотра кода я обнаружил ошибку. Мне интересно, как никто не заметил этого! В приведенном выше коде я написал

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

на самом деле не нужно, чтобы функция запроса деформировала тело функции create.

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

Ответ 2

вам нужно изменить строгий режим базы данных. для отключения следуйте ниже шагу

  1. Откройте config/database.php

  2. найдите 'strict', измените значение true на false и попробуйте снова

Ответ 3

Вот как я это сделал:

Это мой почтовый сервер

Post::create([

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

И это моя модель публикации.

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

И попробуйте обновить миграцию, если ее только на тестовом экземпляре

$ php artisan migrate:refresh

Примечание: migrate: refresh удалит все предыдущие сообщения, пользователи

Ответ 4

Пытаться

'user_id' => auth()->id
или же

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

вместо

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

Ответ 5

Для этого есть два решения.

Во-первых, это создание полей со значениями по умолчанию, установленными в datatable. Это может быть пустая строка, что отлично подходит для сервера MySQL, работающего в строгом режиме.

Во-вторых, если вы начали получать эту ошибку совсем недавно, после обновления MySQL/MariaDB, как и я, и если у вас уже есть большой проект с большим количеством исправлений, все, что вам нужно сделать, это изменить конфигурационный файл MySQL/MariaDB ( например, /etc/my.cnf) и отключить строгий режим для таблиц:

[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION

Эта ошибка начала происходить совсем недавно, из-за того, что по умолчанию установлен новый строгий режим. Удаление STRICT_TRANS_TABLES из sql_mode конфигурации sql_mode делает его работу по-прежнему.

Ответ 6

У меня была аналогичная проблема с регистрацией пользователей сегодня, и я получал

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

Я исправил это, добавив password в мой защищенный массив $ fillable, и он работал

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

Надеюсь, это поможет.

Ответ 7

Попробуйте сделать Auth::id(), например

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

также не забудьте включить Auth-фасад в верхней части вашего контроллера, который является App\Http\Controllers\Auth

Ответ 8

use print_r(Auth);

затем посмотрите, в каком формате вы используете переменную user_id/id и используете ее

Ответ 9

User Auth::user()->id вместо этого.

Вот правильный способ:

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

Если ваш пользователь аутентифицирован, тогда Auth::user()->id сделает трюк.

Ответ 10

Это кажется недостатком в структуре вашей базы данных. Не сохраняйте значение по умолчанию None в заголовке и столбце тела.

Попробуй это:

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

Ответ 11

В моем случае ошибка состояла в том, что я не объявил поле в моем $ fillable массиве в модели. Ну, это похоже на что-то основное, но для нас, кто начал с laravel, он мог работать.

Ответ 12

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

вам не нужен запрос(), поскольку вы делаете это, уже вытягивая значение тела и названия

Ответ 13

Используйте столбец базы данных nullble() в Laravel. Вы можете выбрать значение по умолчанию или обнуляемое значение в базе данных.

Ответ 14

Вышеуказанная ошибка может быть результатом неправильных имен входных переменных в форме просмотра, которая прибегает к поиску значения по умолчанию, так как переменная не указана hence-- SQLSTATE [HY000]: Общая ошибка: 1364 Поле 'user_id' не имеет значение по умолчанию (SQL: вставить в posts (updated_at, created_at) значения (2017-04-27 10:29:59, 2017-04-27 10:29:59))

Ответ 15

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

В вашем файле create_file должна быть включена нулевая опция.

Ответ 16

Удалите метод request(). И это похоже.

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