SQLSTATE [HY000] При попытке выбрать и передать значение из выпадающего списка - PullRequest
0 голосов
/ 09 ноября 2019

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

Таблицы категорий и сообщений в моей базе данных являются отдельными, и в них есть столбец. category_id в сообщениях, которые являются внешним ключом к таблице категорий.

Мой блэйд создания для сообщений:

<div class="container">
    <form method="POST" action="/posts">
        {{csrf_field()}}
        <div>
            <label>Title</label>
            <input type="text" name="title" required>
        </div>
        <div>
            <label>Slug</label>
            <input type="text" name="slug" required>
        </div>
        <div>
            <label>Subtitle</label>
            <input type="text" name="subtitle" required>
        </div>
        <div>
            <label>Content</label>
            <input type="text" name="content" required>
        </div>
        <div class="form-group">
            <select class="form-control" name="categories_id">
                @foreach($categories as $category)
                    <option value="{{$category->title}}">{{$category->title}}</option>
                @endforeach
            </select>
        </div>
        <div  style="margin-top: 10px">
            <input type="submit" value="Make Post">
        </div>
    </form>
</div>

функция хранения на моем контроллере сообщений:

public function store(Request $request)
{
    $post = new Post();

    $post->title = request('title');
    $post->slug = request('slug');
    $post->subtitle = request('subtitle');
    $post->content = request('content');
    $post->save();

    return redirect('/posts');
}

и функция создания

public function create()
{
    $categories = Category::all(['id','title']);
    return view('posts.create',compact('categories',$categories));
}

и, наконец, моя модель

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    public $table = "posts";
}

В настоящее время, когда я пытаюсь выбрать вариант, я получаю

SQLSTATE [HY000]: общая ошибка: 1364 Поле 'category_id' не имеет значения по умолчанию.

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

Ответы [ 2 ]

1 голос
/ 09 ноября 2019

В методе store() перед save() необходимо добавить

$post->content = request('categories_id');

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

1 голос
/ 09 ноября 2019

В вашем select используйте идентификатор категории вместо названия в качестве значения.

<select class="form-control" name="category_id">
    @foreach($categories as $category)
        <option value="{{ $category->id }}">{{ $category->title }}</option>
    @endforeach
</select>

Затем, в вашем методе store(), передайте это значение в метод posts create() (или вы можете использовать $post = new Post() и назначить их вручную, это тоже будет работать, но этонемного короче).

Предполагается, что пользователь выбрал категорию - у вас, похоже, нет никакой проверки, так что вы можете, возможно, изучить использование валидатора (см. https://laravel.com/docs/6.x/validation).

public function store(Request $request)
{
    $post = Post::create($request->only("title", "slug", "subtitle", "content", "category_id"));

    return redirect('/posts');
}

При использовании методов create() или update() необходимо указать, какие поля можно назначать по массе. Это можно сделать, добавив их в свойство $fillable модели.

class Post extends Model
{
    public $table = "posts";

    protected $fillable = ["title", "slug", "subtitle", "content", "category_id"];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...