laravel5.6无法使用save()函数将数据保存到具有复合主键的模型中

p4tfgftt  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(297)

关于这个问题,我在stackoverflow上发现了几个问题,但是很多修复都与较旧的laravel版本有关,似乎在Laravel5.6上不起作用。
这是我的模型:

class Meal extends Model
{
    protected $primaryKey = ['meal_id', 'branch_id'];
    public $incrementing = false;

    public function inhouseOrders(){
        return $this->belongsToMany('App\InhouseOrder')->withPivot('qty');
    }

    public function branch(){
        return $this->belongsTo('App\Branch');
    }
}

这是创建表的迁移:

Schema::create('meals', function (Blueprint $table) {
        $table->string('meal_id')->unique();
        $table->decimal('unit_price', 8, 2);
        $table->string('branch_id');
        $table->foreign('branch_id')->references('branch_id')->on('branches')->onDelete('cascade');
        $table->string('name');
        $table->string('status');
        $table->timestamps();
        $table->primary(['meal_id', 'branch_id']);
    });

我的控制器有一个功能 MealsController 用于更新用餐状态,例如:

public function changeStatus($branch_id, $meal_id){
    $meal = $this->meal->where('meal_id', $meal_id)->where('branch_id', $branch_id)->first();
    //$this->meal->find([$meal_id, $branch_id]) doesn't work here so I have to chain two where() functions

    $meal->status = 'unavailable';
    $meal->save();
    return redirect()->route('view_meals');
}
``` `$meal->save()` 抛出 `Illegal Offset type` 中的以下函数出错 `Model.php` ```
protected function getKeyForSaveQuery()
{
    return $this->original[$this->getKeyName()]
                    ?? $this->getKey();
}

编辑忘了提,我尝试了这个问题中提到的修复:laravel eloquent无法保存具有复合主键的模型
但它只是给了我一个机会 App\Meal does not exist 错误

imzjd6km

imzjd6km1#

您可能应该重新考虑您的关系结构,并像@devk提到的那样在膳食和分支之间使用多对多关系,但这里有一个解决您当前结构的方法。
它可能有问题,我不确定将来是否会给您带来更多麻烦,但是在您的用餐模型中添加以下覆盖应该可以在您的情况下工作

protected function setKeysForSaveQuery(Builder $query)
{
    foreach($this->primaryKey as $pk) {
        $query = $query->where($pk, $this->attributes[$pk]);
    }
    return $query;
}

相关问题