当前位置: 首页 > 知识库问答 >
问题:

Laravel 5.5方法保存不存在时更新条目修改主键

洪景铄
2023-03-14

我正在使用laravel 5.5更新条目。问题是将主键“id”更改为“project_id”后出现的,主键是elequent默认主键。添加项目可以正常工作,但更新项目无法正常工作。这是我得到的错误。

方法save不存在。

这是我的模特。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Project extends Model
{
   protected $primaryKey = 'project_id';
    public function user()
    {
        return $this->belongsTo(User::class);
    }
    public function tasks()
    {
        return $this->hasMany(Task::class);
    }
}

这是我的控制器功能。

public function editProject($id){

        $project = Project::where('project_id', $id)->firstOrFail();
        $data = ["project_info" => $project];
        return view('projects.edit')->with($data);
    }
    public function updateProject(Request $request){
        $data = $request->all();
        $validator = Validator::make($data, [
            'project_title' => 'required',
            'project_description' => 'required',
            'project_start_date' => 'required',
            'project_end_date' => 'required',
            'project_status' => 'required',
        ]);

        $response = [];

        if ($validator->fails()){
            $response["errors"] = [$validator->messages()->first()];
            $response["success"] = false;
            return json_encode($response);
        }

        else{
            $project = Project::where("project_id", $request->input('project_id'))->get();
            $project->project_title = $request->project_title;
            $project->user_id = Session::get('user_id');
            $project->project_description = $request->project_description;
            $project->project_start_date = $request->project_start_date;
            $project->project_end_date = $request->project_end_date;
            $project->project_status = $request->project_status;
            $project->save();
            return redirect('/listProjects');
        }
    }

共有3个答案

姬和豫
2023-03-14

你可以找到它通过id使用

项目::find($id);

或者得到第一个元素,就像詹姆斯说的:

$project = Project::where("project_id", $request->input('project_id'))->first();
范云
2023-03-14

这是我找到的解决办法。

$project_id = $request->input('project_id');
$project = Project::find($project_id);
$project->save();
武功
2023-03-14

使用get()返回一个集合。尽管您传递了一个“唯一”的ID,即project_id,但它仍然会返回一个集合——集合中只有一个元素。

随后,您的代码将无法像您所经历的那样工作,或者至少在没有进行一些更改以使$project引用集合中的第一个元素的情况下无法工作。

不过这是一个快速解决方案,只需更改以下内容:

$project = Project::where("project_id", $request->input('project_id'))->get();

为此:

$project = Project::where("project_id", $request->input('project_id'))->first();

通过使用first(),eloquent将返回与查询匹配的第一个元素,并实际返回该元素(与只有一个元素的集合相反),因此您可以直接编辑和保存它。

 类似资料:
  • 一个被提交了的改动会被永久地保存在仓库(repository)中。然而,在你日常工作中你经常需要“暂时地”保存一下你的一些本地改动。例如,如果你正在开发一个新的功能,但是与此同时又得到了一个错误报告,并且需要马上修复它,而你现在的本地改动又和这个错误毫无关系,因此你必须暂时地停止新功能的开发,来开始着手修复这个错误。并且你还想要保存那些已完成的开发工作,以便之后能继续来完成它。 像这样的情况会随时

  • 我试图实现一个链表类在C和我有问题。我有添加新节点的=运算符。 链接列表类接口: 这里我有=重载实现: 此外,我还有“数组”访问重载方法: 一切正常-我检查了dibugger, 问题是-=不在“head”中保存新节点- 有人知道为什么新的分配没有链接到头- 谢谢!!

  • 所以如果我对一个已经注册的条目调用那个方法,如果它发现一个改变了的属性,它就会更新它? 多谢了。

  • 问题内容: 我有一个用@Transactional注释的方法。我从Oracle数据库检索一个对象,更改一个字段,然后从该方法返回。我忘了保存对象,但是发现无论如何都会更新数据库。 applicationContext 我的方法 我的问题是为什么MyObject会持久保存到数据库? 问题答案: 因为hibernate将自动检测对持久实体所做的更改并相应地更新数据库。hibernate参考手册的第11

  • 我有一个Spring应用程序,其中Domain Object标识符不是由数据库分配的,而是由应用程序生成的。标识符是在BeforeSave回调期间生成并添加到Domain Object中的。保存域对象(插入)后,当尝试保存具有相同标识符的域对象(更新)时,我收到以下错误 原因:组织。springframework。道。Incorrectupdatesemanticdataaccessexcepti

  • 我正在学习hibernate和Spring Boot(也是Thymeleaf),遇到了以下问题: 环境:我有一个表单,处理创建和更新数据基于ID参数在GET方法,如果ID等于数据库中的一行,那么更新,否则保存。ID存储在隐藏的输入标记中,并与表单数据一起插入到实体对象中。然后将该对象发送给一个服务,该服务调用DAO来使用saveOrUpdate()方法保存或更新数据。 问题总结:在我的服务中,我有