【问题标题】:laravel - Update one to many polymorphic relationshiplaravel - 更新一对多多态关系
【发布时间】:2019-04-25 09:29:43
【问题描述】:

我在一对多多态关系中有三个表

┌─────────────────┐          ┌─────────────────┐          ┌──────────────────┐
│ 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');
 }

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

我的代码: 部门控制器:

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】:

    1 - 您可以发送一些带有新电话号码的标识符 (id),这样您就可以知道 phщne 究竟被修改了什么,例如将一些 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

    更新

    但我建议将电话号码作为json 存储在用户和部门的单独字段中,然后可以简单地用请求中的新号码替换模型中的旧号码集,而无需对数据库。

    【讨论】:

      猜你喜欢
      • 2016-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-26
      • 1970-01-01
      • 2014-09-02
      • 2017-02-28
      • 1970-01-01
      相关资源
      最近更新 更多