【问题标题】:Insert a new record if not exist and update if exist, laravel 5.4如果不存在则插入新记录,如果存在则更新,laravel 5.4
【发布时间】:2018-04-02 21:24:49
【问题描述】:

有没有办法在不存在的情况下插入新记录并在存在的情况下更新记录?以下是我使用的代码。

public function store(Request $request)
{
    $inputs = $request->all();
    $this->validate($request,[
            'course_code'=>'required'
        ]);
    $batch = $request->batch;
    $students = User::select('student_id')->where('batch', $batch)->get();

    $course_codes = $inputs['course_code'];
    $data=[];
    foreach ($students as $student) {
        foreach ($course_codes as $course_code) {
        $data[]=[
            'batch' => $batch,
            'student_id' => $student->student_id,
            'semester' => $inputs['semester'],
            'course_code' => $course_code,
            "created_at" =>  \Carbon\Carbon::now(), # \Datetime()
            "updated_at" => \Carbon\Carbon::now()  # \Datetime()
            ]; 
        }
    }    

    DB::table('assign_batches')->insert($data);
    return redirect('/admin/assign/batch/create')->with('message', 'A batch has been assigned to courses successfully!');
}

这是我再次插入相同记录时的输出。 但我想要一个学生 ID 可能有很多课程代码但不能重复。所以我想检查学生是否有相同的课程或课程然后跳过或更新它并插入新记录。 请帮我。 谢谢。

【问题讨论】:

  • 你也可以使用 sql 查询: $sql = "INSERT INTO {$_table} ({$_columns}) VALUES {$_values} ON DUPLICATE KEY UPDATE {$updates} "; DB::statement($sql);

标签: php laravel-5


【解决方案1】:

例如,如果您有一个表格供每个用户投票一次或更新他的投票;

//give the record to use

    $record = request('vote');
    //checkif there is a record for user in model
    $row = Uservoting::where('user_id',Auth->user()->id)->first;
    //if true
    if($row!==null){
        //update
        $row::update(['vote' => $record]);
        //if there isn't in model
    }else{
        //create a new row and insert the value
        $new_row = new Uservoting();
        $new_row->user_id = Auth->user()->id ;
        $new_row->vote = $record ;
        $new_row->vote();`

    }

希望这项工作:) {{--如果您发现任何错误,请告诉我--}}

【讨论】:

    【解决方案2】:

    使用firstOrCreate / firstOrNew

    $students = User::firstOrNew(['student_id' => $request->student_id, 'course_code' => $request->course_code]);
    $students->foo = $request->foo;
    $students->save();
    

    【讨论】:

    • 什么是 foo。解释清楚。
    • @SumitKumarGupta foo 只是另一个与 firstOrNew 无关的列
    【解决方案3】:

    检查id,如果存在则更新,否则插入

     if(isset($request->id)){
        DB::table('assign_batches')->where("id", $request->id)->update($data);
     }else {
        DB::table('assign_batches')->insert($data);
     }
    

    【讨论】:

    • 感谢您的回答。实际上我想检查表行中是否存在两条记录(student_id 和 course_code)。你能澄清一下吗?
    • 获取 id 的隐藏输入,这在 laravel 模板视图中是唯一的,并检查作为给出的答案
    • 我认为没有必要检查student_idcourse_code$isDuplicate = DB::table('assign_batches')->where('student_id',$student->student_id)->where('course_code',$course_code)->count()然后检查$isDuplicate > 0 是否更新否则插入。
    猜你喜欢
    • 1970-01-01
    • 2010-12-10
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 2015-03-31
    相关资源
    最近更新 更多