laravel-更新一对多关系

问题描述 投票:1回答:1

我有三个表,具有一对多的多态关系

┌─────────────────┐          ┌─────────────────┐          ┌──────────────────┐
│ users           │          │ phones          │          │ departments      │
├─────────────────┤          ├─────────────────┤          ├──────────────────┤
| id              |          | id              |          | id               |
| name            |          | name            |          | name             |
└─────────────────┘          | phones_type     |          └──────────────────┘
                             | phones_id       |          
                             └─────────────────┘          

电话型号:

public function phones()
 {
   return $this->morphTo();
 }

用户模型:

public function phones()
 {
   return $this->morphMany('App\Phone', 'phones');
 }

部门模型:

public function phones()
 {
   return $this->morphMany('App\Phone', 'phones');
 }

现在,我想更新电话号码,以便用户可以编辑/添加/删除电话号码。我无法一步一步找到它,因此我尝试先删除所有电话,然后添加新电话号码

我的代码:DepartmentController:

public function update(UpdateDepartment $request, Department $department)
    {
        $department->phones()->delete();
        $department->name = $request['name'];
        $department->save();
        foreach ($request->phone as $value) {
            $phone = new Phone;
            $phone->name = $value;
            $ department->phones()->save($phone);
        }
    }

UpdateDepartment.php:

public function rules()
    {
        return [
            'name' => 'required|alpha_spaces|min:3|max:255|unique: department,name,'.$this-> department ->id,
            'phone'    => 'required|array|unique:phones,name,'
            'phone.*'  => 'required|distinct|unique:phones,name,',
        ];
    }

我有两个问题:

1-这是正确的方法吗?有什么方法可以一步一步同步更新的电话号码?

2-如果这是方法...如何强制执行唯一规则如果用户仅将电话号码添加到现有号码,则忽略给定ID?

php laravel-5.8
1个回答
0
投票

1-您可以发送带有新电话号码的某些标识符(id),因此您将知道确切修改了电话号码,例如,在电话字段中输入data-id="{{ $phone->id }}"并使用javascript建立请求以进行如下操作:

"phones":
  {
    "1"(your phone id):"+123456789",
    "2":"+123654978",
  }

并且比迭代这样的低谷请求数据:

public function update(UpdateDepartment $request, Department $department)
{
    $department->name = $request['name'];
    foreach ($request->phones as $id => $value) {
        $department->phones->transform(function($item) use ($id, $value){
            if($item->id == $id) {
                $item->name = $value;
                $item->save(); //if You using laravel 5 You need to savve each phone model separately
            }
        });
    }

    $department->push(); //if You using laravel 6.x, this will save model with all changed/created relations
}

more about push() method

UPD

但是我建议在用户和部门的单独字段中将电话号码存储为push(),这样就可以用请求中的新电话号码简单地将模型中的旧电话号码替换为新电话号码,而无需对数据库进行不必要的查询。

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