#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);
}
то же самое для модели заказа