Исключение «Недопустимый тип смещения» в методе save() в Laravel

У меня есть простое приложение, созданное с помощью 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');
    }
}

Создание нового заказа работает нормально?

Tayyab 29.04.2024 09:10

да, абсолютно, со всеми соответствующими внешними ключами. Это прекрасно работает

Maffe 29.04.2024 09:16

@kopz, возможно, я только что понял, в чем проблема.... Я допустил ошибку в модели ER во время проекта db... Это не 1-n, а n-n... так что этот класс не должен существует, поскольку он уже будет описан предоставленными методами в Eloquent (принадлежитToMany). На самом деле именно поэтому (я только что понял) это единственный класс, имеющий составной первичный ключ. Стоит ли удалять класс и будет ли это работать?

Maffe 29.04.2024 09:34
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В модели нельзя использовать два первичных ключа.

Попробуйте поработать с «составным ключом»

Решение 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;
    }
}

что вы подразумеваете под «невозможно использовать два первичных ключа в модели»?

Maffe 29.04.2024 10:23

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

Perfect 29.04.2024 13:44

Другие вопросы по теме