EloquentModel::Метод Create возвращает null с кодом состояния OK

#php #laravel

#php #laravel

Вопрос:

Метод Create работает не так, как ожидалось. Всегда возвращает статус OK с нулевыми данными и без вставки в db. К сожалению, ошибка не отображается, поэтому я не знаю, что делать.

 protected function addBooking(Request $request)
{

    $data = $request->all();


    if ($this->validator($data)->fails()) {
        return $this->sendError('Validation Error.', $this->validator($data)->errors());
    }

    Booking::create($data);

    return $data;

}
  

Это миграция

  public function up()
{
    Schema::create('bookings', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->bigInteger('booker_id')->nullable(false)->unsigned();
        $table->bigInteger('classroom_id')->nullable(false)->unsigned();
        $table->string('name');
        $table->string('color')->default("#ff0000");
        $table->string('file')->default(NULL);
        $table->string('start')->nullable(false);
        $table->string('end')->nullable(false);
        $table->timestamps();
        $table->foreign('booker_id')->references('id')->on('users');
        $table->foreign('classroom_id')->references('id')->on('classrooms');
    });
}
  

Модель

   class Booking extends Model
    {
    protected $fillable = [
        'booker_id', 'classroom_id', 'name', 'color', 'file', 'start', 'end'
    ];

    protected $hidden = [
    ];

    protected $casts = [
    ];
}
  

Как я отправляю запрос

 {
  "booker_id": 10,
  "classroom_id": 4,
  "name": "Microsoft",
  "start": "2019-04-25 14:45",
  "end": "2019-04-25 16:45",
  "color": "#ff0000",
  "file": "test"
}
  

Комментарии:

1. Можете ли вы попробовать dd($data) перед своим Booking::create($data) ?

2. если он возвращал null, то $ data равен null, потому что вы возвращаете $ data, а не Booking::create($ data), поэтому я думаю, вы могли бы прервать запрос перед ‘return $ data’, чтобы проверить, достиг ли он вообще этой строки.

3. вывод dd ($ data) слишком велик, чтобы публиковать его здесь

4. не могли бы вы использовать request-> only вместо request-> all и вернуть Booking::create($data);?

5. Да, видимо, ищу в laravel. журнал действительно помог. Проблема была в том, Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails что в основном означает, что я глуп. Одно из значений внешних ключей не существовало.

Ответ №1:

// Для проверки данных следует использовать запрос формы. и переместите всю свою бизнес-логику в model

 protected function addBooking(Request $request)
{

    $data = $request->all();


    if ($this->validator($data)->fails()) {
        return $this->sendError('Validation Error.', $this->validator($data)->errors());
    }

    return Booking::create($data)->fresh();

}
  

Ответ №2:

В Laravel есть соглашение о маршрутизации, если вы создаете новый элемент, имя метода должно быть store() . Я использую два способа создания нового элемента: первый короче, и я добавляю проверку в StoreBooking

 public function store( StoreBooking $request ) {
  $data = $request->all();
  $booking = Booking::query()->create( $data );
}
  

Логер на основе документации laravel:

 public function store( StoreBooking $request ) {
 $booking = new Booking();
 $booking->bookier_id = $request->bookier_id;
 /**
  add other items
 **/
 $booking->save();
}