我正在尝试更新具有两个主键的Model。
模型
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']; ...
移民
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'); });
这是应该更新库存模型的代码,但不是。
$inventory = Inventory::where('user_id', $user->id)->where('stock_id', $order->stock->id)->first(); $inventory->quantity += $order->quantity; $inventory->save();
我收到此错误:
Illegal offset type
我也尝试使用updateOrCreate()方法。它不起作用(我得到同样的错误)。
谁能告诉我们应该如何更新带有两个主键的Model?
我已经遇到过几次这个问题。您需要覆盖一些属性:
protected $primaryKey = ['user_id', 'stock_id']; public $incrementing = false;
和方法(功劳):
/** * 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); }
请记住,此代码需要引用Eloquent Builder类,
use Illuminate\Database\Eloquent\Builder;
我建议将这些方法放入HasCompositePrimaryKeyTrait中,以便您可以use在需要它的任何模型中使用它。
HasCompositePrimaryKey
use