I've this simple application built with Laravel and Eloquent, that should connect to a localhost phpmyAdmin Database. I've got this method:
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();
}
which should increment by 1 the attribute "qt" in my table "orders" (described by the class Order
) in the record corresponding to the given client which has ordered the given dish.
But I'm always getting an "Illegal offset type" error corresponding to the $order->save();
row.
this is my Order
class:
<?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');
}
}
You can not use two primary keys in the model.
Try to work with "composite key"
Solution 1:
With library:
composer command to install the library
composer require thiagoprz/eloquent-composite-key
Model code:
<?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');
}
}
For reference check here: Laravel: working with Composite Keys
Solution 2:
Without installing any library:
<?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;
}
}