簡體   English   中英

laravel - 更新一對多多態關系

[英]laravel - Update one to many polymorphic relationship

我在一對多多態關系中有三個表

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

更新部門.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?

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
}

更多關於push()方法

更新程序

但我建議將電話號碼作為json存儲在用戶和部門的單獨字段中,這樣就可以簡單地用請求中的新數字替換模型中的舊數字集,而無需對數據庫進行不必要的查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM