Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 具有多对多关系的Laravel复选框_Php_Laravel_Checkbox_Blade_Laravelcollective - Fatal编程技术网

Php 具有多对多关系的Laravel复选框

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

我从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('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);
}