2017-05-01 2 views
1

Je tirais les maladies de DB et de les présenter en front-end avec des cases à cocher:cases Laravel avec many-to-many

<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> 

Une fois que je soumets la forme, je reçois le résultat de la $request->diseases comme celui-ci :

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

où le premier nombre représente disease_id, et l'autre présente si la case est cochée ou non. Les relations avec le tableau croisé dynamique sont effectués dans les modèles correctement, et ce que j'essaie de faire dans le contrôleur est:

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

mais échoue avec l'erreur:

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"})) 

Relation à l'intérieur Patient modèle:

protected $guarded = ['id']; 

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

EDIT:

Quand je fais:

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

Je reçois la liste des années ID comme ceci:

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

Et erreur:

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

Avec disease_id incrémenter sur chaque demande

Répondre

1

La question voici que la méthode sync n'est pas censé être un arra associatif y. Vous devriez lui passer un seul tableau contenant les ID de maladie à attacher. Pour ce faire, vous devrez pré-traiter votre tableau:

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

Si $request->diseases retourne une collection Laravel, vous devrez peut-être appeler toArray() ou le jeter à un tableau premier.

Référence: Les "associations Syncing" du https://laravel.com/docs/5.4/eloquent-relationships#inserting-and-updating-related-models

+0

Hmm étrange, je l'ai fait un 'gettype()' sur la demande, et je me suis chaîne? Probablement une chaîne JSON alors. J'essaye avec 'json_decode()' ... – Norgul

+0

Que faire si vous 'dd ($ request);'? –

+0

C'est une liste d'huuuge. Mais si je fais cette ligne '$ diseases = array_keys (array_filter (json_decode ($ request-> diseases, true)))' 'Je reçois de nouveau la violation d'intégrité mais maintenant il est alimenté avec 2 valeurs (27, 1) pour' disease_id 'et' patient_id'. Le second est correct, le premier est incrémenté à chaque requête – Norgul