【问题标题】:Laravel 5 Override Eloquent Save MethodLaravel 5 覆盖 Eloquent 保存方法
【发布时间】:2021-01-21 16:10:15
【问题描述】:

我有复合主键,所以 Laravel 的 save() 方法不起作用。因此我需要覆盖保存方法。例如,我的主键是由 column_a 和 column_b 组成的复合键。你能举个例子如何覆盖保存方法以及我把它放在哪里?

我的主键:column_a,column_b

我尝试了以下方法:

protected function setKeysForSaveQuery(Builder $query)
{
    parent::setKeysForSaveQuery($query);
    $query->where('locale', '=', $this->locale);
    return $query;
}

我找到了上面的代码,但即使我调用一个只从数据库读取值的方法,它也会导致 500 Internal Server Error。我已将 $primaryKey = 'column_a' 和 'locale'(在 where 内)设置为 column_b。我不知道 $this->locale 指的是什么?

这是我找到的另一种方法,但它也失败了

protected $secondaryKey = 'column_b';
function newQuery()
{
    $query = parent::newQuery();
    $query->where($this->secondaryKey, '=', $this->type);
    return $query;
}

再说一次,我不知道 $this->type 指的是什么。

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    我找到了解决方案。在模型中,添加primaryKey变量和如下函数

    protected $primaryKey = array('column1','column2');
    
    protected function setKeysForSaveQuery(\Illuminate\Database\Eloquent\Builder $query) {
        if (is_array($this->primaryKey)) {
            foreach ($this->primaryKey as $pk) {
                $query->where($pk, '=', $this->original[$pk]);
            }
            return $query;
        }else{
            return parent::setKeysForSaveQuery($query);
        }
    }
    

    来源:https://github.com/laravel/framework/issues/5517#issuecomment-113655441

    【讨论】:

      【解决方案2】:

      您可以覆盖它。您可以将其放入您的模型中,或者您可以将其放入一个特征中,并根据需要在多个模型中使用此 trate。

      原来的 save() 方法是 here(第 832 行),也许这会有所帮助。

      【讨论】:

      • 你能给我举个例子吗?我不知道如何从 where 子句中删除 id 并将多个 where 子句(其他列)添加到查询中
      • 我不明白你到底是什么意思,但由于这是一个新问题,我建议你创建新的答案并描述那里的一切(用代码,你到底想要什么,你'已经尝试过)。我相信我或其他人会帮助你。
      猜你喜欢
      • 1970-01-01
      • 2013-08-14
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多