Проблема с обновлением таблицы Laravel Общая ошибка: поле 1364 «start_date» не имеет значения по умолчанию

#php #mysql #laravel #eloquent #eloquent-relationship

Вопрос:

надеюсь, вы в безопасности и у вас все хорошо. Я столкнулся с проблемой с реляционной таблицей laravel. У меня есть три стола, ПОЛЬЗОВАТЕЛЬ, КЛИЕНТ ,ЗАКАЗ и ПАРКОВКА АВТОМОБИЛЕЙ. Теперь клиент связан с пользователем, а ЗАКАЗ связан как с Клиентом, так и с ПОЛЬЗОВАТЕЛЕМ, в то время как CAR_PARKING связан только с ЗАКАЗОМ. Проблема, с которой я сталкиваюсь, заключается в том, что, когда я пытаюсь обновить порядок таблиц, в нем говорится #Общая ошибка: 1364 Поле «start_date» не имеет значения по умолчанию# Ниже приведены мои различные модели таблиц и контроллер

 public function updateOrderCarParking(Request $request,  $id)
    {
        if (Auth::check()) {
            $carParkingData = $request->only('removed', 'removed_date');
            $validateCarParking = Validator::make($carParkingData, [
                'removed' => 'required|boolean',
                'removed_date' => 'nullable'
            ]);
            
            if ($validateCarParking->fails()) {
                return response()->json($validateCarParking->errors(), 422);
            }
            $orderData = $request->only('paid', 'amount_paid', 'overdue', 'currency', 'user_id');

            $validateOrder = Validator::make($orderData, [
                'amount_paid' => 'required|regex:/^d* (.d{1,2})?$/',
                'currency' => [
                    'required',
                    Rule::in(['USD', 'CAD'])
                ],
                "paid" => "required|boolean",
                'overdue' => 'regex:/^d* (.d{1,2})?$/'
            ]);
            if ($validateOrder->fails()) {
                return response()->json($validateOrder->errors(), 422);
            }

            $updateCarParking = CarParking::updateOrCreate([
                'removed' => $request->removed,
                'removed_date' => $request->removed_date,
            ]);
            $order = Order::find($id);
            $order->carParkings()->save($updateCarParking);

            $updateOrder = Order::find($id);
            $updateOrder->amount_paid = $request->amount_paid;
            $updateOrder->paid = $request->paid;
            $updateOrder->currency = $request->currency;
            $updateOrder->overdue = $request->overdue;
            $updateOrder->user_id = Auth::user()->id;

            $updateOrder->save();

            if ($order amp;amp; $updateOrder) {
                return response()->json([
                    'success' => true,
                    'message' => 'Order updated successfully',
                    'data' => $order
                ], Response::HTTP_OK);
            }
        } else {
            return response()->json([
                'success' => false,
                'message' => 'Can not update',
            ], Response::HTTP_UNAUTHORIZED);
        }
    } 
 <?php

namespace AppModels;

use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;

class Order extends Model
{
    use HasFactory;
    protected $fillable = ['order_type', 'amount_paid','client_id', 'user_id', 'price', 'currency', 'paid', 'overdue'];
    public function user()
    {
        return $this->belongsTo(User::class);
    }
    public function client()
    {
        return $this->belongsTo(Client::class);
    }

    public function carParkings(){
        return $this->hasMany(CarScrap::class);
    }
    
}

<?php

namespace AppModels;

use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;

class CarParking extends Model
{
    use HasFactory;
    protected $fillable = ['start_date', 'end_of_free_charge', 'order_id', 'removed', 'removed_date'];
    public function order()
    {
        return $this->belongsTo(Order::class);
    }
}


<?php

use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;

class CreateOrdersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('orders', function (Blueprint $table) {
            $table->id();
            $table->decimal('price', 8, 2);
            // $table->date('start_date');
            $table->enum('order_type', ['Storage rent', 'Forklift', 'Ramp', 'Car Parking', 'Car Scrap', 'Shipping']);
            $table->enum('currency', ['USD', 'CAD']);
            $table->boolean('paid')->default('0');
            $table->decimal('amount_paid')->default(0);     
            $table->decimal('overdue')->nullable();     
            $table->foreignId('client_id')->constrained('clients')->onDelete('cascade');
            $table->foreignId('user_id')->constrained('users')->onDelete('cascade');
            $table->timestamps();
        });
        Schema::enableForeignKeyConstraints();
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('orders', function (Blueprint $table) {
            $table->dropConstrainedForeignId("client_id");
            $table->dropConstrainedForeignId("user_id");
        });
        Schema::dropIfExists('orders');
    }
}


<?php

use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;

class CreateCarParkingsTable extends Migration
{
    public function up()
    {
        Schema::create('car_parkings', function (Blueprint $table) {
            $table->id();
            $table->date('start_date');
            $table->date('end_of_free_charge');            
            $table->boolean('removed')->default("0");
            $table->date('removed_date')->nullable();
            $table->timestamps();
            $table->foreignId('order_id')->constrained('orders')->onDelete('cascade');
        });
        Schema::enableForeignKeyConstraints();
    }
    public function down()
    {
        Schema::table('car_parkings', function (Blueprint $table) {
            $table->dropConstrainedForeignId("order_id");
        });
        Schema::dropIfExists('car_parkings');
    }
} 

Что я делаю не так?

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

1. В схеме заказа вы не установили значение по умолчанию для «дата начала» и сохраняли заказы без него.

Ответ №1:

Замените существующий метод следующим:

 class CreateCarParkingsTable extends Migration
{
    public function up()
    {
        Schema::create('car_parkings', function (Blueprint $table) {
            $table->id();
            $table->date('start_date')->nullable();
            $table->date('end_of_free_charge');            
            $table->boolean('removed')->default("0");
            $table->date('removed_date')->nullable();
            $table->timestamps();
            $table->foreignId('order_id')->constrained('orders')->onDelete('cascade');
        });
        Schema::enableForeignKeyConstraints();
    }
    public function down()
    {
        Schema::table('car_parkings', function (Blueprint $table) {
            $table->dropConstrainedForeignId("order_id");
        });
        Schema::dropIfExists('car_parkings');
    }
}
 

Если вы получите ошибку для любого другого поля, сделайте его недействительным, как я сделал в start_date

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

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

2. Я даже сделал это, и в нем говорится: Общая ошибка: 1364 Поле «order_id» не имеет значения по умолчанию (SQL: вставить в значения car_parkings (удалено, удалено, обновлено, создано).(1, ?, 2021-10-02 08:35:00, 2021-10-02 08:35:00)). идентификатор заказа в таблице car_parking не может быть обнулен!!! это внешний ключ

Ответ №2:

Установите значение start_date равным Нулю при переносе базы данных.

Пример:

 $table->date('start_date')->nullable();
 

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

1. Здравствуйте, основная проблема здесь в том, что я не хочу обновлять значение start_date в своей таблице CAR_PARKING. Это должна быть та ценность, которая была у меня, когда я ее создавал. Я не знаю, понимаете ли вы, что я имею в виду. Я создал его раньше, и если я хочу обновить эту таблицу, я не хочу обновлять столбец start_date. Сделав его обнуляемым, вы, вероятно, измените предыдущее значение.

2. Я даже сделал это, и там написано: Общая ошибка: 1364 Поле «order_id» не имеет значения по умолчанию (SQL: вставить в car_parkings ( removed , removed_date , updated_at , created_at ) значения (1, ?, 2021-10-02 08:35:00, 2021-10-02 08:35:00)). идентификатор заказа в таблице car_parking не может быть обнулен!!! это внешний ключ

3. Если вы не обновите значение для start_date, оно не будет равно нулю.

4. Я пытаюсь сделать то, что вы сказали раньше, но это также предупреждает о том, что внешний ключ(order_id) не имеет значения по умолчанию. Я тоже должен добавить nullable туда?????

Ответ №3:

Как мы можем представить, что только две строки кода разрешили ошибки? Нет необходимости устанавливать значение null в любом столбце. Я получил решение, выполнив этот код ниже:

     $client = Client::findOrFail($client->id);

    $client->update($request->all()); 

Но я ввел в модель функцию отношений. Я имел в виду, что в клиентской модели я поставил

 public function orders(){
  return $this->hasMany(Order::class);
} 

то же самое для модели заказа