无法找出将集合更新插入 tablr 的查询

问题描述 投票:0回答:2

我想将行插入或更新到我的模型表中。但无法弄清楚查询。 SmStudentAttendance 这是我的模型。 $students是我的收藏。

我已将集合字段放入数组中。

foreach ($students as $student) {
        array_push($temp_id, $student->id);
        array_push($temp_lastname, $student->last_name);
        array_push($temp_academic_id, $student->academic_id);
        array_push($temp_attendance, 'P');
        array_push($temp_attendancedate, $date);
        array_push($temp_schoolid, '1');
        array_push($temp_updatedby, '1');
        array_push($temp_createdby, '1');
    }

现在,如果表中不存在 Student_id 和 attend_date 的行,我想插入它们,否则更新(如果已存在)。 这是查询:

        SmStudentAttendance::upsert('attendance_type', $temp_attendance, 'attendance_date', $temp_attendancedate, 'student_id', $temp_id, 'created_by', $temp_createdby, 'updated_by', $temp_updatedby, 'school_id', $temp_schoolid, 'academic_id', $temp_academic_id);

我收到错误:

Argument 1 passed to Illuminate\Database\Eloquent\Builder::upsert() must be of the type array, string given, called in D:\xampp\htdocs\sms\vendor\laravel\framework\src\Illuminate\Support\Traits\ForwardsCalls.php on line 23
php laravel eloquent upsert
2个回答
2
投票

您正在为列而不是行创建数组,这会导致问题,请考虑以下代码:

$studentRows = [];
foreach ($students as $student) {
        $studentRows[] = [ 
              'id' => $student->id,
              'last_name' => $student->last_name,
              'academic_id' => $student->academic_id,
              'attendance_type' => 'P',
              'attendance_date' => $date,
               // .... rest of the fields
       ]
}
SmStudentAttendance::upsert($studentRows, [ 'id', 'last_name', 'academic_id' ], [ 'attendance_type', 'attendance_date' ]);


一般来说,想法是向它传递一个要更新插入的行数组,然后传递一个要匹配的字段数组和一个要更新的字段数组。然后 Laravel 将使查询找到与指定字段匹配的所有行并更新这些行,然后插入与给定字段不匹配的行。


0
投票

错误消息“传递给 Illuminate\Database\Eloquent\Builder::upsert() 的参数 1 必须是给定的数组类型,字符串”,表明第一个参数需要是数组而不是您正在设置的字符串.

请参阅 https://laravel.com/docs/8.x/eloquent#upserts 的文档作为示例。该方法接受两个数组。第一个包含要更新的所有数据,第二个包含唯一标识记录的字段。您将需要更新您的方法调用以匹配此语法。

© www.soinside.com 2019 - 2024. All rights reserved.