У меня есть простое приложение, созданное с помощью Laravel и Eloquent, которое должно подключаться к локальной базе данных phpmyAdmin. У меня есть этот метод:
public function clickOrderPlateClient($id_client, $id_plate){
$order = Order::where('id_client', $id_client)
->where('id_plate', $id_plate)
->first();
$order->qt = ($order->qt) + 1;
$order->save();
}
который должен увеличить на 1 атрибут "qt" в моей таблице "заказы" (описанной классом Order
) в записи, соответствующей данному клиенту, заказавшему данное блюдо.
Но я всегда получаю ошибку «Недопустимый тип смещения», соответствующую строке $order->save();
.
это мой Order
класс:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Order extends Model
{
protected $table ='orders';
protected $primaryKey = ['id_client','id_plate'];
public $timestamps = false;
public $incrementing = false;
public function getClient(){
return $this->belongsTo('App\Models\Client','id_client');
}
public function getPlate(){
return $this->belongsTo('App\Models\Plates','id_plate');
}
}
да, абсолютно, со всеми соответствующими внешними ключами. Это прекрасно работает
Отвечает ли это на ваш вопрос? Недопустимый тип смещения при сохранении связи один-ко-многим в laravel
@kopz, возможно, я только что понял, в чем проблема.... Я допустил ошибку в модели ER во время проекта db... Это не 1-n, а n-n... так что этот класс не должен существует, поскольку он уже будет описан предоставленными методами в Eloquent (принадлежитToMany). На самом деле именно поэтому (я только что понял) это единственный класс, имеющий составной первичный ключ. Стоит ли удалять класс и будет ли это работать?
В модели нельзя использовать два первичных ключа.
Попробуйте поработать с «составным ключом»
Решение 1:
С библиотекой:
команда композитора для установки библиотеки
composer require thiagoprz/eloquent-composite-key
Код модели:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Thiagoprz\EloquentCompositeKey\HasCompositePrimaryKey;
class Order extends Model
{
use HasCompositePrimaryKey;
protected $table ='orders';
protected $primaryKey = ['id_client','id_plate'];
public $timestamps = false;
public $incrementing = false;
public function getClient(){
return $this->belongsTo('App\Models\Client','id_client');
}
public function getPlate(){
return $this->belongsTo('App\Models\Plates','id_plate');
}
}
Справочную информацию можно найти здесь: Laravel: работа с составными ключами
Решение 2:
Без установки какой-либо библиотеки:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Order extends Model
{
protected $table ='orders';
protected $primaryKey = 'composite_key';
public $timestamps = false;
public $incrementing = false;
public function getClient(){
return $this->belongsTo('App\Models\Client', 'id_client');
}
public function getPlate(){
return $this->belongsTo('App\Models\Plates', 'id_plate');
}
// Define the composite key attribute
public function getCompositeKeyAttribute()
{
return $this->id_client . '-' . $this->id_plate;
}
}
что вы подразумеваете под «невозможно использовать два первичных ключа в модели»?
Для ясности добавлено слово «использовать»: «В модели нельзя использовать два первичных ключа».
Создание нового заказа работает нормально?