php laravel laravel-5 eloquent composite-primary-key

php - Modelo de Laravel con actualización de dos claves principales



laravel-5 eloquent (1)

Esta pregunta ya tiene una respuesta aquí:

Estoy tratando de actualizar el modelo que tiene dos claves principales.

Modelo

namespace App; use Illuminate/Database/Eloquent/Model; class Inventory extends Model { /** * The table associated with the model. */ protected $table = ''inventories''; /** * Indicates model primary keys. */ protected $primaryKey = [''user_id'', ''stock_id'']; ...

Migración

Schema::create(''inventories'', function (Blueprint $table) { $table->integer(''user_id'')->unsigned(); $table->integer(''stock_id'')->unsigned(); $table->bigInteger(''quantity''); $table->primary([''user_id'', ''stock_id'']); $table->foreign(''user_id'')->references(''id'')->on(''users'') ->onUpdate(''restrict'') ->onDelete(''cascade''); $table->foreign(''stock_id'')->references(''id'')->on(''stocks'') ->onUpdate(''restrict'') ->onDelete(''cascade''); });

Este es el código que debe actualizar el modelo de inventario, pero no lo hace.

$inventory = Inventory::where(''user_id'', $user->id)->where(''stock_id'', $order->stock->id)->first(); $inventory->quantity += $order->quantity; $inventory->save();

Me sale este error:

Illegal offset type

También intenté usar el método updateOrCreate (). No funciona (me sale el mismo error).

¿Alguien puede decir cómo se debe actualizar el modelo con dos claves principales?


Me he encontrado con este problema un par de veces. Es necesario anular algunas propiedades:

protected $primaryKey = [''user_id'', ''stock_id'']; public $incrementing = false;

y métodos ( credit ):

/** * Set the keys for a save update query. * * @param /Illuminate/Database/Eloquent/Builder $query * @return /Illuminate/Database/Eloquent/Builder */ protected function setKeysForSaveQuery(Builder $query) { $keys = $this->getKeyName(); if(!is_array($keys)){ return parent::setKeysForSaveQuery($query); } foreach($keys as $keyName){ $query->where($keyName, ''='', $this->getKeyForSaveQuery($keyName)); } return $query; } /** * Get the primary key value for a save query. * * @param mixed $keyName * @return mixed */ protected function getKeyForSaveQuery($keyName = null) { if(is_null($keyName)){ $keyName = $this->getKeyName(); } if (isset($this->original[$keyName])) { return $this->original[$keyName]; } return $this->getAttribute($keyName); }

Sugiero poner esos métodos en un Rasgo HasCompositePrimaryKey para que pueda use en cualquiera de sus modelos que lo necesiten.