Как проверить модель отношений в почтальоне - PullRequest
0 голосов
/ 19 сентября 2018

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

SQLSTATE [HY000]: общая ошибка: 1364 Поле 'rating' не имеет значения по умолчанию (SQL: вставить в ratings (user_id, book_id, updated_at, created_at) значения (2, 6, 2018-09-19 10:03:11, 2018-09-19 10:03:11))

Вот мой Рейтинг модели

class Rating extends Model
{
protected $fillable = ['user_id', 'book_id', 'rating'];

/**
 * Rating/Book
 * A rating belongs to a book
 */
public function book()
{
    return $this->belongsTo(Book::class);
}
}

Книжная модель

class Book extends Model
{
protected $fillable = ['user_id', 'title', 'author'];

/**
 * Book/User relationship
 * A book belongs to only one user
 */
public function user()
{
    return $this->belongsTo(User::class);
}

/**
 * Book/Rating relationship
 * A book has many ratings
 */
public function ratings()
{
    return $this->hasMany(Rating::class);
}
}

RatingController

public function store(Request $request, Book $book)
{
    // Allow only logged in users to rate books
    if ($request->user()->id) {

        $rating = Rating::create([
            'user_id'   => $request->user()->id,
            'book_id'   => $book->id,
        ],
        [
            'rating'    => $request->rating
        ]);

        return new Rating($rating);
    } else {
        return response()->json(['error', 'Login to rate this book.'], 403);
    }
}

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

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

ошибка sql и не связана с почтальоном, в модели Rating у вас есть столбец с названием rating, и этот столбец не может быть пустым, когда вы вставляете запись в базу данных, у вас есть два решения, вы можете установить значение для столбца rating вкод, когда значение пустое (например, 0 или ноль или пустая строка и ...). Другое решение: вы устанавливаете значение по умолчанию для столбца рейтинга в базе данных, например, 0 при миграции:

 $table->integer('rating')->default(0)

ИЛИ, скажем, база данныхэто поле может быть нулевым

$table->integer('rating')->nullable()
0 голосов
/ 19 сентября 2018
public function store(Request $request, Book $book)
{
    // Allow only logged in users to rate books
    if ($request->user()->id) {

        try {
            $rating = new Rating([
                'user_id'   => $request->user()->id,
                'book_id'   => $book->id,
                'rating'    => $request->rating
            ]);

            $rating->save();
            return $rating;
        } catch(Exception $ex) {
            return response()->json(['error', 'Failed to create new user'], 403);
        }
    } else {
        return response()->json(['error', 'Login to rate this book.'], 403);
    }
}
0 голосов
/ 19 сентября 2018

Ваше значение для рейтинга не отправляется.Почему рейтинг в отдельном массиве?Вы пытаетесь создать один объект для отправки в базу данных.Я бы попробовал:

if ($request->user()->id) {

    $rating = Rating::create([
        'user_id'   => $request->user()->id,
        'book_id'   => $book->id,
        'rating'    => $request->rating
     ])

 ...

Хорошим тестом было бы создание значения по умолчанию в базе данных для рейтинга (например, 0), чтобы вы могли проверить, какие части вашего запроса успешны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...