Php 具有多对多关系的Laravel复选框
我从DB中提取疾病,并在前端用复选框显示它们:Php 具有多对多关系的Laravel复选框,php,laravel,checkbox,blade,laravelcollective,Php,Laravel,Checkbox,Blade,Laravelcollective,我从DB中提取疾病,并在前端用复选框显示它们: <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('di
<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>
其中第一个数字表示疾病id,另一个数字表示复选框是否选中。与透视表的关系在模型中正确建立,我在controller中尝试做的是:
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"}))
患者内部的关系
模型:
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\u id
在每个请求上递增这里的问题是sync
方法不应该是关联数组。您应该将包含要附加的疾病ID的单个数组传递给它。为此,您需要预处理阵列:
if ($request->has('diseases')) {
$diseases = array_keys(array_filter($request->diseases)));
$patient->diseases()->sync($diseases);
}
如果$request->diseases
返回一个Laravel集合,您可能需要调用toArray()
或首先将其强制转换为数组
参考:在Hmm的“同步关联”部分奇怪,我对请求做了一个
gettype()
,得到了字符串?可能是JSON字符串。我正在尝试使用json\u decode()
…如果你dd($request)怎么办代码>?这是一个huuuge列表。但是如果我把那行代码写成$diseases=array\u键(array\u filter(json\u decode($request->diseases,true))代码>我再次收到完整性违规,但现在它被输入了两个值(27,1),分别是疾病id
和患者id
。第二个是可以的,第一个随每个请求递增。为什么要对它进行JSON解码?因为我不能对字符串使用数组方法,而且toArray()
不能作为有效的传递。但当我转储该行的结果时,我会得到一个已检查ID的数组。也许是别的什么地方出了问题?更新问题
if ($request->has('diseases')) {
$diseases = array_keys(array_filter($request->diseases)));
$patient->diseases()->sync($diseases);
}