【发布时间】:2019-10-30 21:11:49
【问题描述】:
我在 Laravel 中将这个解决方案用于 2 个主键: https://stackoverflow.com/a/37076437/225114
谁能告诉我如何覆盖 Eloquent 的“增量”方法来处理重复键?
Laravel 框架 5.8.35
我将 'CompositePrimaryKey ' 特征包含在模型中,例如...
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use App\Models\Traits\CompositePrimaryKey;
class Devices extends Model
{
public $table = 'devices';
protected $primaryKey = ['id1','id2'];
public $incrementing = false;
public $timestamps = false;
use CompositePrimaryKey;
}
这是特点:
namespace App\Models\Traits;
use Illuminate\Database\Eloquent\Builder;
trait CompositePrimaryKey {
/**
* 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);
}
/**
* Perform the actual delete query on this model instance.
*
* @return void
*/
protected function runSoftDelete()
{
$query = $this->newQueryWithoutScopes()->where($this->getKeyName()[0], $this->attributes[$this->getKeyName()[0]])
->where($this->getKeyName()[1], $this->attributes[$this->getKeyName()[1]]);
$time = $this->freshTimestamp();
$columns = [$this->getDeletedAtColumn() => $this->fromDateTime($time)];
$this->{$this->getDeletedAtColumn()} = $time;
if ($this->timestamps && ! is_null($this->getUpdatedAtColumn())) {
$this->{$this->getUpdatedAtColumn()} = $time;
$columns[$this->getUpdatedAtColumn()] = $this->fromDateTime($time);
}
$query->update($columns);
}
}
谢谢。
【问题讨论】:
-
来吧注册,我们需要更多信息。你使用的是什么lavavel版本。你能告诉我们模型的迁移吗?
-
@konstantinkoslow - 好点。 :) 我添加了更多信息
标签: laravel eloquent composite-primary-key