#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());