使用 Laravel Eloquent 使用复合键更新表

Posted

技术标签:

【中文标题】使用 Laravel Eloquent 使用复合键更新表【英文标题】:Update a table with composite key using Laravel Eloquent 【发布时间】:2020-04-07 18:53:47 【问题描述】:

我严重卡在一个带有复合键的表中。我正在尝试使用 eloquent 通过两个主键过滤记录。但我开始知道 eloquent 不支持复合键。我经历了很多解决方案,但没有一个解决方案足够清晰,初学者可以理解。

解决方案代码表示使用以下代码编辑模型类:

<?php
class CustomerAddress extends Model 
    protected function setKeysForSaveQuery(Builder $query)
    
        $query
            ->where('Customer_No', '=', $this->getAttribute('Customer_No'))
            ->where('Address_Name', '=', $this->getAttribute('Address_Name'));
        return $query;
    


我想使用 laravel 提供的资源控制器来执行更新功能: 我的代码如下所示:

  /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $sem_course_id, $clo_id)
    
        $id = $this->getKeyForSaveQuery();
        $request->validate([

            'assignments_weightage'=>'required',
            'quizes_weightage'=>'required',
            'project_weightage'=>'required',
            'class_participation_weightage'=>'required',
            'mid_weightage'=>'required',
            'final_weightage'=>'required',


        ]);

        $course = CoursesMarksScheme::find($clo_id,$sem_course_id); 
        $course->assignments_weightage =  $request->get('assignments_weightage');
        $course->quizes_weightage =  $request->get('quizes_weightage');
        $course->project_weightage = $request->get('project_weightage');
        $course->class_participation_weightage = $request->get('class_participation_weightage');
        $course->mid_weightage =  $request->get('mid_weightage');
        $course->final_weightage = $request->get('final_weightage');
        $course->save();

        return redirect('/coursesmarks');
    

另外,请指导我如何使用带有主键的资源控制器,因为它会为一些参数抛出错误? 请帮我。看了很多网上的文章,实在是太累了,却无法解决问题。

【问题讨论】:

您是否尝试使用代码更新您的模型? 【参考方案1】:

我看到您找到的解决方案代码仅用于更新,而不是用于查找。 Laravel 在迁移中支持复合键,但在 eloquent 中不支持。

也许更好,使用这样简单的解决方案,不要浪费时间:

CoursesMarksScheme::where(['clo_id' => $clo_id, 'sem_course_id' => $sem_course_id])
    ->update($request);

我想必填字段在 CoursesMarksScheme 模型中的 $fillable 变量中。

【讨论】:

它给了我一个错误,函数有两个参数,如何处理?我正在使用 laravel 资源控制器! 有没有其他方法可以同时获取两个键值? 我看到你收到错误,因为这个 CoursesMarksScheme::find($clo_id,$sem_course_id)。 试试我的解决方案。 雄辩中作为主键要提什么?

以上是关于使用 Laravel Eloquent 使用复合键更新表的主要内容,如果未能解决你的问题,请参考以下文章

遍历数组集合并返回命名键值对(Laravel/Eloquent)

如何使用 Laravel Eloquent 更新 PostgresQL 中 jsonb 列的多个“键”

Laravel Eloquent:返回数组键作为字段 ID

Laravel Eloquent truncate - 外键约束

Laravel Eloquent ID 作为数组键

使用 Laravel 的 foreignIdFor 方法并创建复合唯一键