Laravel 8: SQLSTATE[23000]: нарушение ограничения целостности: заголовок столбца 1048 не может быть нулевым

#php #mysql #laravel #laravel-8

#php #mysql #laravel #laravel-8

Вопрос:

Я работаю с Laravel 8, и я создаю простую форму, которая выглядит следующим образом:

 <form action="/create" method="POST">
    @csrf 
    <label for="title">Title:</label>
    <input type="text" name="title"></br>
    <label for="body">Body:</label>
    <textarea name="body" cols="30" rows="10"></textarea>
    <button>Send</button>
</form>
  

Затем web.php я добавляю это:

 Route::post('/create',function(){
    $validator = Validator::make(request()->all(),[
        'title' => 'required',
        'body' => 'required'
    ]);
    Article::create([
        'title' => request('title'),
        'body' => request('body')
    ]);
    return redirect('/create');
});
  

Но как только я отправляю форму, я вижу сообщение:

Исключение IlluminateDatabase QueryException SQLSTATE[23000]: нарушение ограничения целостности: заголовок столбца 1048 не может быть нулевым (SQL: вставить в articles ( title , body , updated_at , created_at ) значения (?, ?, 2020-10-27 07:36:47, 2020-10-27 07:36:47))

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

И это также миграция таблицы:

 public function up()
{
    Schema::create('articles', function (Blueprint $table) {
        $table->id();
        $table->string('title');
        $table->text('body');
        $table->timestamps();
    });
}
  

Итак, если вы знаете, как я могу решить эту проблему, пожалуйста, дайте мне знать, я был бы очень признателен…

Заранее спасибо.

Комментарии:

1. Попробуйте dd(request()->all()) просмотреть все параметры post

2. array:3 [▼ "_token" => "WupvBPXbBaL1lxOrOMRSq5weZH654tKNh2ewwJZS" "title" => null "body" => null ]

3. Итак, вот почему ваш код не работает. Мои рекомендации; 1) Попробуйте не использовать обработчики запросов на основе закрытия. Используйте контроллеры.

4. Итак, почему проверка не работает, поэтому пользователь ДОЛЖЕН заполнить форму

5. 2) Используйте $request->validate() вместо создания нового средства проверки.

Ответ №1:

Вы создаете экземпляр средства проверки, но не проверяете данные с его помощью.

     $validator = Validator::make(request()->all(),[
        'title' => 'required',
        'body' => 'required'
    ]);
    
    // Validates request data. If fails redirect to /create
    if ($validator->fails()) {
        return redirect('/create')
            ->withErrors($validator)
            ->withInput();
     }
    // Validation passed, create article.
    Article::create([
        'title' => request()->input('title'),
        'body' => request()->input('body')
    ]);
    return redirect('/create');
  

Также прочитайте о работе с сообщениями об ошибках проверки, чтобы понять, как отображать сообщения об ошибках на /create странице.

Ответ №2:

Если вы создаете экземпляр средства проверки вручную, вам придется самостоятельно обрабатывать неудачную проверку. Вы можете проверить, не завершилась ли проверка с $validator->fails() помощью . Я бы использовал $request->validate() вместо этого, поэтому Laravel автоматически обрабатывает неудачную проверку.

Создание валидаторов вручную:

Если вы не хотите использовать validate метод в запросе, вы можете создать экземпляр валидатора вручную, используя Validator фасад. make Метод на фасаде генерирует новый экземпляр валидатора:

 <?php

namespace AppHttpControllers;

use AppHttpControllersController;
use IlluminateHttpRequest;
use IlluminateSupportFacadesValidator;

class PostController extends Controller
{
    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'title' => 'required|unique:posts|max:255',
            'body' => 'required',
        ]);

        if ($validator->fails()) {
            return redirect('post/create')
                        ->withErrors($validator)
                        ->withInput();
        }

        // Store the blog post...
    }
}
  

После проверки, не удалась ли проверка запроса, вы можете использовать
withErrors метод для отправки сообщений об ошибках в сеанс. При
использовании этого метода $errors переменная будет автоматически использоваться совместно
с вашими представлениями после перенаправления, что позволяет вам легко отображать их
обратно пользователю. withErrors Метод принимает средство проверки, a
MessageBag или PHP array .

$request->validate():

 public function store(Request $request)
{
    $validatedData = $request->validate([
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ]);

    // The blog post is valid...
}
  

Теперь мы готовы заполнить наш store метод логикой
validate нового сообщения в блоге. Для этого мы будем использовать метод validate
, предоставляемый IlluminateHttpRequest объектом. Если
правила проверки пройдут, ваш код продолжит выполняться нормально;
однако, если проверка завершится неудачно, будет выдано исключение, и
правильный ответ об ошибке будет автоматически отправлен обратно пользователю. В
случае традиционного HTTP-запроса будет
сгенерирован ответ перенаправления, в то время как для запросов AJAX будет отправлен ответ JSON.

Итак, в вашем случае это будет следующее:

 use IlluminateHttpRequest;
use AppModelsArticle;

Route::post('/create', function (Request $request) {
    $validatedData = $request->validate([
        'title' => 'required',
        'body' => 'required',
    ]);

    Article::create($validatedData);

    return redirect('/create');
});
  

Ответ №3:

Вам нужно будет указать fillable либо guarded атрибут or в модели, так как все модели Eloquent по умолчанию защищают от массового присвоения.

Вы можете видеть это в черте, используемой моделью:

 trait GuardsAttributes
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [];

    /**
     * The attributes that aren't mass assignable.
     *
     * @var array
     */
    protected $guarded = ['*'];

    // ...
}
  

Поэтому вам нужно сделать поля заполняемыми.

 class Article extends Model
{
    protected $fillable = [
        'title',
        'body',
    ];
}
  

Ответ №4:

 Route::post('/create',function(){
    $validator = Validator::make(request()->all(),[
        'title' => 'required',
        'body' => 'required'
    ]);
    Article::create([
        'title' => request()->input('title'),
        'body' => request()->input('body')
    ]);
    return redirect('/create');
});
  

Комментарии:

1. Вы написали заполняемую функцию в файле статьи?

2. защищенный $ fillable = [ ‘title’, ‘body’ ];

3. Валидатор::make($request-> all(), [ ‘title’ => ‘required’, ‘body’ => ‘required’, ])->validate();

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

Ответ №5:

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

 Route::post('/create',function(){
$validateData = request()->validate([
'title' => 'required',
'body' => 'required',
]);
Article::create(request()->all());
return redirect('/create');
});
  

Комментарии:

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