Невозможность передать значения в базу данных из красноречивых связей в laravel 6 - PullRequest
0 голосов
/ 17 февраля 2020

Я работаю над своим первым laravel проектом, который является библиотечным приложением. Сейчас я работаю над формой для создания книги, и мне пришлось создать здесь много красноречивых отношений. Я создал отношения языков с книгами, что было легко, потому что одна книга может иметь только один язык (в данном случае), но один язык может использоваться для нескольких книг. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что я хочу иметь возможность выбирать жанры также в форме, поэтому я связал таблицу жанров со своей таблицей книг с отношением ownToMany и, конечно, я также создал сводную таблицу. Теперь я думаю, что проблема должна быть в функции хранилища моего BookController, но я просто не могу понять, что это такое.

Вот часть моего кода: (извините, если я что-то упустил я впервые задаю вопрос здесь)

Функция хранилища моего BookController:

public function store(Request $request)
    {
        $validatedData = $request->validate([
            'title' => 'required|max:255',
            'author_id' => 'required',
            'year' => 'required|numeric',
            'publisher_id' => 'required',
            'genres' => 'exists:genres,id',
            'language_id' => 'required',
            'isbn' => 'required|numeric',
            'pages' => 'required|numeric',
        ]);

        $book = Book::create($validatedData);
        $book->genres()->attach(request('genre_id'));


        return redirect('books')->with('success', 'Book was added!');
    }

Если я отправляю свою форму прямо сейчас, я получаю это сообщение:

SQLSTATE [HY000 ]: Общая ошибка: 1364 Поле 'genre_id' не имеет значения по умолчанию (SQL: вставить в books (title, author_id, year, publisher_id, language_id, isbn, pages, updated_at, created_at) значения (Spani sh для кошек, 1, 1994, 1, 1, 1234567891128, 2337, 2020-02-17 16:37:07, 2020-02- 17 16:37:07)) my create.blade. php

<div class="form-group">
                <label for="genre_id">Genre(s):</label>
                @foreach($genres as $genre)
                <input type="checkbox" name="genre_id[]" value="{{ $genre->id }}">{{ $genre->name }}
                @endforeach
                </select>
                @error('genre_id')
                <div class="alert alert-danger">{{ $message }}</div>
                @enderror
            </div>

Значение жанров отображается в моей форме, но я не могу ввести их в свою базу данных.

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 18 февраля 2020

Во-первых, из вашего примера я не могу быть уверен, намереваетесь ли вы передать один genre через данные запроса или массив genres, так как использование слова genres приводит меня к мысли, что более одного genre, но ключ проверки является единственным, используйте genres.*, если вы собираетесь передать массив genre_id значений.

Это один из недостатков Laravel магических c методов, так как вы запрашиваете $book->genres()->attach(request('genre_id')), а request('genre_id') не существует в вашей проверке, вы обнаружите, что вы на самом деле передаете значение null, например $book->genres()->attach(null), которое вызывает ошибку.

Чтобы решить эту проблему, вы должны изменить ->attach() вызов на $book->genres()->attach($validatedData['genres']), который обеспечит передачу вашего проверенные данные для метода присоединения.

...