2015-12-16 2 views
2

Я использую Laravel 5.1.Laravel 5.1 обновить столбец столбца поворота, не отбрасывая существующие записи

У меня есть две таблицы, а именно users и medicines с many-to-many отношения. Родственный models, как показано ниже:

class User extends BaseModel { 

    use SoftDeletes; 
    protected $dates = ['deleted_at']; 

    protected $table = 'users'; 

    public function medicines(){ 
     return $this->belongsToMany('App\Models\Medicine')->withPivot('id', 'time','config' ,'start','end'); 
    } 
} 

и

class Medicine extends BaseModel{ 

    use SoftDeletes; 
    protected $dates = ['deleted_at']; 

    protected $table = 'medicines'; 

    public function users(){ 
     return $this->belongsToMany('App\Models\User')->withPivot('id', 'time','config' ,'start','end' ); 
    } 
} 

many-to-many реляционная таблица user_medicine имея некоторые дополнительные pivot columns, как показано ниже:

id(PK) user_id(FK users) medicine_id(FK medicines) time config  start  end 
1  1     41      09:00 {dispense:2} 2015-12-01 2015-12-25 
2  1     43      10:00 {dispense:1} 2015-12-10 2015-12-22 
3  1     44      17:00 NULL   2015-12-10 2015-12-31 

Теперь я хочу, чтобы изменить время специфическая медицина. То, что я сделал коды, как показано ниже:

public function updateMedicationTime($fields){ 

    $result = array(); 

    try { 
     $user = User::find($fields['user_id']); 

     $medicines = $user->medicines()->where('medicines.id',$fields['medicine_id'])->first(); 

     if (!empty($medicines)){ 
      $medicine_times = json_decode($medicines->pivot->time); 

      foreach ($medicine_times as $key=>$medicine_time){ 

       if ($medicine_time->time == $fields['oldtime']){ 

        $medicine_time->time = $fields['newtime']; 
       } 
      } 

      // Update the time column of provided medicine id 
      $user->medicines()->where('medicines.id',$fields['medicine_id'])->sync(array($medicines->id , array("time"=>json_encode($medicine_times))), false); 

      // I also have tried 

      // $medicines->sync(array($medicines->id , array("time"=>json_encode($medicine_times))), false); OR 
      // $medicines->pivot->sync(array($medicines->id , array("time"=>json_encode($medicine_times))), false); 

     } 

    } 
    catch(Exception $e){ 
     throw $e; 
    } 

    return $result; 
} 

Но вместо updating выходящего столбца времени many-to-many таблицы, это inserting новый рекорд с медициной id = 1 с предоставленными time и null другими столбцами. Может ли кто-нибудь предложить, где я делаю ошибку?

ответ

3

Существует метод, называемый updateExistingPivot, который вы можете использовать:

$user = User::find($id); 
$user->medicines()->updateExistingPivot($medicine_id, ['time' => $time], false); 

Последние параметры определяет, если родительская таблица должна быть «прикоснулся», это означает, что временные метки в updated_at полей обновляются.

Смежные вопросы