当我在 Laravel 上创建新行时出现非法偏移类型

Posted

技术标签:

【中文标题】当我在 Laravel 上创建新行时出现非法偏移类型【英文标题】:Illegal offset type when i create a new row on Laravel 【发布时间】:2021-06-02 07:39:22 【问题描述】:

我们创建了三个表,分别称为“users”、“corso”,“iscrizione”是用户和 corso 之间的中间表,它具有 PK/FK 两个属性。我们成功构建了创建/更新方法/read/delete 'corso' 中的行,我们手动填充了 'users'。 我们正在尝试实现 iscrizione 的 create 方法,但是当我们尝试使用 Postman 执行它时会生成以下错误:

ErrorException: Illegal offset type in file I:\Test db Laravel\testdb\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Concerns\HasAttributes.php on line 1146

???? Illegal offset type

这些是数据库中每个表的类模型:

Iscrizione 模型

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Iscrizione extends Model

    use HasFactory;

    protected $hidden = ['idCorso', 'idUtente'];
    protected $primaryKey = ['idCorso', 'idUtente'];
    protected $table = 'iscrizione';

Corso 模型

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Corso extends Model

    use HasFactory;

    protected $primaryKey = 'idCorso';
    protected $table = 'corso';
    protected $fillable = ['tipo','nome', 'membriMax', 'inizio', 'fine'];

最后一个是我们ApiController类上的创建方法:

public function iscrizione(Request $request)
        
        $iscrizione = new Iscrizione();

        $iscrizione->idCorso = $request->input('idCorso');
        $iscrizione->idUtente = $request->input('idUtente');

        $iscrizione->save();
        return response()->json($iscrizione);

    

【问题讨论】:

【参考方案1】:

您需要覆盖 setKeysForSaveQuery 以使用您为 Iscrizione 模型定义的复合键:

Iscrizione.php

protected function setKeysForSaveQuery(Builder $query)

    return $query->where('idCorso', $this->getAttribute('idCorso'))
        ->where('idUtente', $this->getAttribute('idUtente'));

并删除以下行

protected $primaryKey = ['idCorso', 'idUtente'];

【讨论】:

在添加到 Iscrizione.php 模型时出现此错误:Method setKeysForSaveQuery is not compatible with Illuminate\Database\Eloquent\Model::setKeysForSaveQuery() 你是用use语句导入Builder的吗? 是的,我们做到了。我们导入了use Illuminate\Database\Query\Builder; 那么可能是一些函数签名不匹配的问题。您正在开发哪个版本? 我们正在开发 Laravel 框架 8.30.1

以上是关于当我在 Laravel 上创建新行时出现非法偏移类型的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试在 laravel 中更新数据透视表的内容时,有啥方法可以解决非法偏移类型错误

Laravel'非法字符串偏移'leave_form'问题与数组

Laravel 文件管理器非法偏移类型

Laravel 4 - 警告:isset 中的非法偏移类型或 \bootstrap\compiled.php 中为空

从api流明获取数据时出现错误的非法字符串偏移[重复]

当我尝试使用 Laravel 中的“别名”从数据库中获取值时如何修复“未定义的偏移量:0”