2017-05-01 67 views
1

我从DB拉动疾病和复选框呈现他们在前端:Laravel复选框许多一对多的关系

<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12"> 
    @foreach($diseases as $disease) 
     <div class="col-md-6"> 
      <div class="form-group"> 
       <label>{{ Form::checkbox('diseases','0','', 
           ['class' => 'grey','data-id'=> $disease->id]) }} 
        {{$disease->title}} 
       </label> 
       <div class="clearfix"></div> 
      </div> 
     </div> 
    @endforeach 
</div> 

一旦我提交表单,我得到的$request->diseases这样的结果:

1:"1" 
2:"1" 
3:"0" 
4:"1" 
5:"0" 
6:"0" 
... 

其中第一个数字代表disease_id和其它一个呈现的复选框是否被选中或没有。关系到数据透视表的模型中正确,和我尝试在控制器做的是:

if ($request->has('diseases')) { 
    $patient->diseases()->sync($request->diseases); 
} 

但这种失败,错误:

Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key 
constraint fails (`db_name`.`disease_patient`, CONSTRAINT `disease_patient_patient_id_foreign` 
FOREIGN KEY (`patient_id`) REFERENCES `patients` (`id`) ON DELETE CASCADE) (SQL: insert into 
`disease_patient` (`disease_id`, `patient_id`) 
values (17, {"1":"0","2":"0","3":"1","4":"1","5":"1","6":"1","7":"1","8":"1","9":"0","10":"1","11":"0","12":"1","13":"0","14":"0","15":"0","16":"0","17":"0","18":"0","19":"0","20":"0","21":"0","22":"0","23":"0"})) 

关系里面Patient型号:

protected $guarded = ['id']; 

public function diseases() 
{ 
    return $this->belongsToMany('App\Disease', 'disease_patient', 'disease_id', 'patient_id'); 
} 

编辑:

当我做:

$diseases = array_keys(array_filter(json_decode($request->diseases, true))); 
return $diseases; 

我得到的ID列表,像这样:

0:1 
1:2 
2:8 
3:14 
4:15 
5:21 

和错误:

(SQL: insert into `disease_patient` (`disease_id`, `patient_id`) values (33, 1)) 

随着disease_id增加对每个请求

回答

1

问题这里是sync方法不应该是一个关联阵年。你应该传递一个包含疾病ID的数组来连接。要做到这一点,你需要预先处理您的数组:

if ($request->has('diseases')) { 
    $diseases = array_keys(array_filter($request->diseases))); 
    $patient->diseases()->sync($diseases); 
} 

如果$request->diseases返回Laravel集合,你可能需要调用toArray()或第一它转换到一个数组。

参考:的https://laravel.com/docs/5.4/eloquent-relationships#inserting-and-updating-related-models

+0

嗯“正在同步关联”一节奇怪了,我做了'将gettype()'的要求,和我串?那么可能是JSON字符串。我正在尝试'json_decode()'... – Norgul

+0

如果你'dd($ request);'? –

+0

这是一个huuuge名单。但是,如果我做了这条线'$ diseases = array_keys(array_filter(json_decode($ request-> diseases,true)));'我再次得到完整性违规,但现在它正在用2个值(27,1)for'disease_id '和'patient_id'。第二个是没问题,第一个是每个请求递增 – Norgul