具有2个主键的Laravel-更新“增量”方法?

问题描述 投票:0回答:1

我正在Laravel中将这个解决方案用于2个主键:https://stackoverflow.com/a/37076437/225114

有人可以告诉我如何也重写雄辩的“增量”方法以使用重复的键吗?

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);
  }

}

谢谢。

laravel eloquent composite-primary-key
1个回答
0
投票

只需在特征的开头添加以下功能:

...
use Illuminate\Database\Eloquent\Builder;

trait CompositePrimaryKey {

    public function getIncrementing() {
        return false;
    }

并在模型的开头而不是结尾处设置您的特征。就这样。

...
class Devices extends Model
{

    use CompositePrimaryKey;

    ...

最后,您可以在模型public $incrementing = false;中删除变量的声明,因为它现在是多余的。

© www.soinside.com 2019 - 2024. All rights reserved.