我在用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
有一种方法updateExistingPivot
可以使用:
$user = User::find($id); $user->medicines()->updateExistingPivot($medicine_id, ['time' => $time], false);
最后一个参数指定是否应"触摸"父表,这意味着updated_at
更新字段的时间戳.