Обновить несколько идентификаторов для одного идентификатора (Laravel) - PullRequest
0 голосов
/ 09 января 2020

Я хочу обновить несколько Departments для одного устройства. Я попробовал этот метод, но это не правильно.

Как обновить идентификаторы нескольких отделов?

Форма:

enter image description here

Запрос:

enter image description here

Функция контроллера:

$pre_data = UnitDepartment::where('unit_id', $request->id)->get();
    if ($pre_data) {
        foreach ($pre_data as $value) {
            $value->delete();
        }
        $department = $request->department_id;
        foreach ($department as $value) {
            $unitDepart = new UnitDepartment();
            $unitDepart->unit_id = $request->id;
            $unitDepart->department_id = $value;
            $unitDepart->save();
        }
    }

Таблица:

enter image description here

Ответы [ 4 ]

1 голос
/ 09 января 2020

Я обнаружил, что это таблица, относящаяся к отделам и подразделениям.

Таким образом, вы можете построить отношения многие-ко-многим между ними,

Создать отношения в ваших моделях

в модели блока:

    public function departments()
    {
        return $this->belongsToMany('App\Unit','unit_department','unit_id','department_id');
    }

в модели отдела:

    public function units()
    {
        return $this->belongsToMany('App\Department','unit_department','department_id','unit_id');
    }

Присоедините новые отношения, просто используйте:

Unit::find($request->unit_id)->departments()
                             ->sync($request->department_id);

К сожалению, вы не можете использовать softDelete для sync().

И я не думаю, что вам нужно мягко удалять с unit_departments. Как pivot, тогда оно не должно иметь значения, если оно удалено или нет.

И если пользователь обновляет отношения на частом, эта таблица будет быстро расти.

Если вам действительно нужно soft-delete, вы можете написать это так:

$department_ids = $request->department_id;
$unit_id = $request->unit_id

// soft delete the unit_departments not in request:
UnitDepartment::where('unit_id', $unit_id)->whereNotIn('department_id', $department_ids)->delete();

// insert the new department_id+unit_id relationship
$exist_department_ids = UnitDepartment::where('unit_id', $unit_id)->whereIn('department_id', $department_ids)->pluck('department_ids')->all();

$dept_ids = array_diff($exist_department_ids, $department_ids);
$depts = collect($dept_ids)->map(function($dept_id) use ($unit_id) { 
    return ['department_id' => $dept_id, 'unit_id' => $unit_id];
});
UnitDepartment::insert($depts);
0 голосов
/ 09 января 2020

я пробовал это

$unit = UnitDepartment::where('unit_id', $request->unit_id)->get();
    foreach ($unit as $item) {
        $existDepartment[] = $item->department_id;
    }
    $newDepartment = $request->department_id;
    $result = array_diff($newDepartment, $existDepartment);
    if ($result) {
        foreach ($result as $item) {
            $data = new UnitDepartment();
            $data->unit_id = $request->unit_id;
            $data->department_id = $item;
            $data->save();
        }
    }
0 голосов
/ 09 января 2020

, чтобы правильно выбрать предварительные данные, используйте

$pre_data = UnitDepartment::where('unit_id', $request->id)->first();
0 голосов
/ 09 января 2020

проблема в том, что вы отправляете unit_id в запросе, однако, используя $request->id в запросе, который неверен. Измените каждое вхождение $request->id с $request->unit_id в контроллере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...