SQLSTATE [HY000]: общая ошибка: 1364 Поле 'title' не имеет значения по умолчанию - PullRequest
2 голосов
/ 28 июня 2019

Привет. Я пытаюсь вставить данные в БД, но он говорит:

SQLSTATE [HY000]: общая ошибка: 1364 Поле 'title' не имеет значения по умолчанию (SQL: вставить вprojects (owner_id, updated_at, created_at) значения (1, 2019-06-28 13:17:11, 2019-06-28 13:17:11))

Я следую Laracasts Laravel с нуля учебник

контроллер:

      public function store()
      {
        $attributes = $this->validateProject();
        $attributes['owner_id'] = auth()->id();
        $project = Project::create($attributes);

    //Project::create($attributes);
    //Project::create(request(['title', 'description']));

          Mail::to($project->owner->email)->send(
            new ProjectCreated($project)
          );

        return redirect('/projects');
      }

модель:

  protected $guarded = [];

таблица:

      Schema::create('projects', function (Blueprint $table) {
        $table->increments('id');
        $table->unsignedInteger('owner_id');
        $table->string('title');
        $table->text('description');
        $table->timestamps();

        $table->foreign('owner_id')->references('id')->on('users')->onDelete('cascade');
    });

файл блейда:

   <form method="POST" action="/projects">
   @csrf
   <div class="field">
    <label class="label" for="title">Title</label>
    <div class="control">
        <input type="text" class="input {{ $errors->has('title') ? 'is-danger' : ''}}" name="title" value="{{ old('title') }}" placeholder="Project title">
    </div>
    </div>
    <div class="field">
      <label class="label" for="title">Description</label>
      <div class="control">
        <textarea name="description" class="textarea {{ $errors->has('description') ? 'is-danger' : ''}}" placeholder="Project description">{{ old('description') }}</textarea>
    </div>
   </div>
      <div class="field">
      <div class="control">
        <button type="submit" class="button is-link">Create Project</button>
        </div>
    </div>

   @include('errors')

  </form>

как решить эту проблему

Ответы [ 4 ]

1 голос
/ 28 июня 2019

У вас есть поле title в таблице projects, но вы не присваиваете ему значение.Так как он установлен как Not Nullable, это выдаст эту ошибку.

Вам потребуется, чтобы все атрибуты были в атрибуте $fillable в модели при использовании Project::create($attributes);, которого у вас, похоже, нет.

Примером $fillable будет:

protected $fillable = [
    'title',
    'description',
    'owner_id',
];

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

Редактировать

Вам нужно изменить свою функцию следующим образом:

public function store(ProjectRequest $request)
  {
    $attributes = $request->all();
    $attributes['owner_id'] = auth()->id();
    $project = Project::create($attributes);

      Mail::to($project->owner->email)->send(
        new ProjectCreated($project)
      );

    return redirect('/projects');
  }

Вы можете создать ProjectRequestКласс, запустив php artisan make:request ProjectRequest, а затем поместив туда ваши правила проверки.

Подробнее здесь .

1 голос
/ 28 июня 2019

Сама ошибка очевидна, проверьте код:

$attributes['owner_id'] = auth()->id();
$project = Project::create($attributes);

здесь вы создаете новую запись в таблице проекта, и для этого вы берете только один столбец, т.е. owner_id, но в таблице есть столбец title, который не имеет значения по умолчанию. Поэтому при создании новой записи либо возьмите весь столбец, либо укажите для этого столбца значение по умолчанию (ноль или что-то еще).

Чтобы установить null в качестве значения по умолчанию при миграции:

$table->string('title')->nullable();

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

enter image description here

1 голос
/ 28 июня 2019

Добавьте название вашей колонки в fillable, как это в вашей модели (я думаю, ваша модель называется Project.php)

То есть класс вашей модели должен понравиться.

<?php

mnamespace App;

use Illuminate\Database\Eloquent\Model;

class Project extends Model
{
protected $guarded = [];
protected $fillable = [
    'title', 'owner_id','description'
];
public function owner()
{
    return $this->belongsTo(User::class);
}

public function tasks()
{
    return $this->hasMany(Task::class);
}

public function addTask($task)
{
    $this->tasks()->create($task);
}
}

А затем обновите ваш controller store метод следующим образом.

public function store(Request $request)
  {
    $attributes = $this->validateProject();
    $attributes->owner_id = auth()->id();
    $attributes->title = $this->request->title;
    $attributes->description= $this->request->description;
    $project = Project::create($attributes);

      Mail::to($project->owner->email)->send(
        new ProjectCreated($project)
      );

    return redirect('/projects');
  }
0 голосов
/ 28 июня 2019

Невозможно отследить проблему, с которой вы столкнулись.Попробуйте этот код и прокомментируйте, если у вас возникли проблемы.

Внутри вашего файла маршрута

Route::post('project', 'ProjectController@store')->name('project.store');

В вашем представлении создания

<form method="POST" action="{{route('project.store')}}">
    @csrf
    <div class="field">
        <label class="label" for="title">Title</label>
        <div class="control">
            <input type="text" class="input {{ $errors->has('title') ? 'is-danger' : ''}}" name="title"
                   value="{{ old('title') }}" placeholder="Project title">
        </div>
    </div>
    ...
    <div class="field">
        <div class="control">
            <button type="submit" class="button is-link">Create Project</button>
        </div>
    </div>

    @include('errors')

</form>

В вашем ProjectController

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Post;

class UserController extends Controller{
    public function store(Request $request)
    {
        $this->validate($request, [
            'title' => 'required|max:255',
        ]);

        $post = Post::create([
                    'title' => $request->title,
                    'owner_id' => auth()->id()
                    ]);

    return redirect('/projects');
  }

РЕДАКТИРОВАТЬ 1

В предыдущем коде внутри ProjectsController вместо использования атрибутов $ попробуйте использовать

public function store()
    {
        $project = Project::create([
            'title' => request('title'),
            'owner_id' => request('owner_id')
        ]);

        Mail::to($project->owner->email)->send(
            new ProjectCreated($project)
        );

        return redirect('/projects');
    }

EDIT 2

Вместо использованиясоздать метод, попробуйте этот

public function store()
{
        $project = new Project();
        $project->title = request('title');
        $project->owner_id = request('owner_id');
        $project->save();
...
}
...