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