SQLSTATE[HY000]: Общая ошибка: 1364 Поле ‘author_id’ не имеет значения по умолчанию

#php #mysql #eloquent #laravel-5.5 #laravel-5.8

#php #mysql #красноречивый #laravel-5.5 #laravel-5.8

Вопрос:

На самом деле я новичок в Laravel Framework. Пытался опубликовать в базе данных Mysql, я получал сообщение об ошибке в моем Author_id.

SQLSTATE[HY000]: Общая ошибка: поле 1364 ‘author_id’ не имеет значения по умолчанию.

Проверил везде, но все усилия оказались безуспешными

Вот миграция

 public function up()
{
    Schema::create('posts', function (Blueprint $table) {
        //$table->engine = “InnoDB”;

        $table->increments('id');
        $table->integer('author_id')->unsigned();
        $table->foreign('author_id')->unique()->references('id')->on('users')->onDelete('restrict');
        $table->string('title');
        $table->string('slug')->unique();
        $table->text('excerpt');
        $table->text('body');
        $table->unsignedInteger('user_id');
        $table->string('image')->nullable();   
        $table->timestamps();
    });



}
  

Вот мой create.blade.php:

  <section class="content">
        <div class="row">
          <div class="col-xs-12">
            <div class="box">
              <div class="box-body">

              {!! Form::model($post, [
                    'method' => 'POST',
                    'url'  => 'backend/blog'
              ]) !!}  

             {{-- <form method="POST" action="{{ url('blog/store') }}" enctype="multipart/form-data">
                @csrf  --}}

                    <div class="form-group {{ $errors->has('title') ? 'has-error' : '' }}">
                        {!! Form::label('title') !!}
                        {!! Form::text('title', null, ['class' => 'form-control']) !!}

                        @if($errors->has('title'))
                        <span class="help-block">{{ $errors->first('title') }} </span>
                        @endif
                    </div>


                    <div class="form-group {{ $errors->has('slug') ? 'has-error' : '' }}">
                      {!! Form::label('slug') !!}
                      {!! Form::text('slug', null, ['class' => 'form-control'])!!}

                      @if($errors->has('slug'))
                      <span class="help-block">{{ $errors->first('slug') }} </span>
                      @endif
                      </div>

                        <div class="form-group {{ $errors->has('excerpt') ? 'has-error' : '' }}">
                          {!! Form::label('excerpt') !!}
                          {!! Form::textarea('excerpt', null, ['class' => 'form-control'])!!}

                        @if($errors->has('excerpt'))
                        <span class="help-block">{{ $errors->first('excerpt') }} </span>
                        @endif

                        </div>

                            <div class="form-group {{ $errors->has('body') ? 'has-error' : '' }}">
                              {!! Form::label('body') !!}
                              {!! Form::textarea('body', null, ['class' => 'form-control'])!!}

                        @if($errors->has('body'))
                        <span class="help-block">{{ $errors->first('body') }} </span>
                        @endif
                            </div>

                          <div class="form-group {{ $errors->has('published_at') ? 'has-error' : '' }}">
                            {!! Form::label('published_at', 'Published Date') !!}
                            {!! Form::text('published_at', null, ['class' => 'form-control', 'placeholder' => 'Y-m-d H:i:s'])!!}

                            @if($errors->has('published_at'))
                            <span class="help-block">{{ $errors->first('published_at') }} </span>
                            @endif
                            </div>

                        <div class="form-group {{ $errors->has('category_id') ? 'has-error' : '' }}">
                          {!! Form::label('category_id', 'Category') !!}
                          {!! Form::select('category_id', AppCategory::pluck('title', 'id'), null, ['class' => 'form-control', 'placeholder' => 'Choose category' ]) !!}

                          @if($errors->has('category_id'))
                          <span class="help-block">{{ $errors->first('category_id') }} </span>
                          @endif
                        </div>

                        <hr>

                        {!! Form::submit('Create new post', ['class' => 'btn btn-primary']) !!}
                {!! Form::close() !!}
              </div>
              <!-- /.box-body -->
            </div>
            <!-- /.box -->
          </div>
        </div>
      <!-- ./row -->
    </section>
  

Вот моя модель Post:

 class Post extends Model
  

{

 protected $fillable = ['title', 'slug', 'excerpt', 'body', 'user_id', 'published_at', 'category_id'];
protected $dates = ['published_at'];

public function author()
{
    return $this->belongsTo(User::Class);
}

public function category()
{
    return $this->belongsTo(Category::class);
}
// images path
Public function getImageUrlAttribute($Value)
{
    $imageUrl = "";

if ( ! is_null($this->image))
{
    $imagePath = public_path(). "/img/" . $this->image;
    if (file_exists($imagePath)) $imageUrl = asset("img/" . $this->image);
}
return $imageUrl;
  

}

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

1. Вы должны добавить функцию nullable (), подобную этой. $table->integer(‘author_id’) -> unsigned()-> nullable();

2. Эта ошибка означает, что вы не заполняете данными author_id . Также это поле отсутствует в вашем $fillable массиве или вы должны указать это поле как обнуляемое при миграции.

3. Да, я знаю, что не заполнял его, даже когда я добавил его в свой заполняемый файл, я все равно получаю ту же ошибку. Я новичок в Laravel Nerea, пожалуйста, направьте меня, спасибо. Под какой страницей я должен добавить этот Safak Ciplak?

4. Вы должны связать созданную вами запись с конкретным пользователем (он же автор). Еще установите для столбца author_id значение null, но это не то, что вы хотели бы, поскольку у сообщений есть авторы

5. Очень правильно в Nikos M. Nullable — не лучший вариант в этом случае. Автор должен нести ответственность за каждый опубликованный пост. Был бы очень признателен, если бы вы могли мне помочь. этот этап действительно отнял у меня так много времени. Заранее спасибо.

Ответ №1:

Например, чтобы связать сообщение с текущим пользователем (например, внутри метода контроллера, который сохраняет сообщение в БД), выполните следующие действия:

 // controller method
public function savePost( Request $request )
{
    $data = $request->validate([
        // your validation rules here..
        ]);
    $post = new Post(); // from Post model
    $post->fill($data);
    $post->author()->associate(Auth::user()); // relate post to current user
    $post->save(); // save to db
    return view('whatever_your_view_is', []);
}
  

Если вам нужна дополнительная информация, оставьте комментарий

В Post модели внесите следующее изменение:

 public function author()
{
    return $this->belongsTo(User::Class, 'author_id'); // specify the column which stores the author in posts table
}
  

Смотрите документацию по определению отношений.

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

1. Я не могу достаточно поблагодарить вас в Nikos M … я заметил, что теперь сохраняется в таблице, но выдает мне эту ошибку, SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец ‘user_id’ в ‘списке полей’ (SQL: вставить в posts ( title , slug , .. Но у меня нет ни одного столбца ‘user_id’ в моей таблице. Помогите мне, Никос

2. @365Techsolutions, обновленный ответ, дайте мне знать, если это решит вашу проблему

3. Позже решил это. Большое вам спасибо за ваши ответы, это действительно помогло мне на каком-то уровне. Позже обнаружил, что я использовал эту уменьшенную версию созданного сообщения. Эта строка кода была проблемой $request-> user()-> posts()-> create($request-> all());