Synchronisation avec pivot

Par Alexandre #lbac, il y a 10 ans


Salut amis devs,

Aujourd'hui je suis confronté à un petit soucis avec une table pivot. Je dispose d'articles et d'images, je fais la liaison entre elles sans soucis. Mon soucis intervient au moment de définir une image en couverture d'un article. l'image se met en couverture avec un boolean dans la table pivot comme ceci :

id | article_id | media_id | is_cover (boolean)

Voici comment je synchronise mes médias avec mes articles :

$mediasIds = []; if( $this->request->has('medias') ) { foreach( $this->request->input('medias') as $key => $value ) { if( $this->request->has('is_cover') && $this->request->input('is_cover') == $value ) { array_push($mediasIds, [$value => ['is_cover' => true]]); } else { array_push($mediasIds, $value); } } //dd($mediasIds); $this->article->medias()->sync($mediasIds); }

Les champs sont bien renseignés, sans . j'obtiens cette erreur :

preg_replace(): Parameter mismatch, pattern is a string while replacement is an array

Je comprends l'erreur mais pourtant je suis bien la doc de laravel pour la synchronisation :/
Comment devrais-je formater mon tableau pour obtenir le résultat voulu ?

Voici le tableau des Ids si ça peut aider :

array:2 [ 0 => "20" 1 => array:1 [ 21 => array:1 [ "is_cover" => true ] ] ]

Merci par avance =)

5 réponses

Alexandre #lbac, il y a 10 ans

Personne n'a une idée ? :/

arnich, il y a 10 ans

Si je ne me trompe pas ton tableau devrai plutot avoir la forme suivante :

array:2 [ "20", "21" => ["isCover" => true] "23", ]
Alexandre #lbac, il y a 10 ans

Oui tout à fait, le soucis c'est que je n'arrive pas à le formater de cette façon dans mon foreach

arnich, il y a 10 ans

As tu essayer quelque chose dans le genre ?

if ($value == true){ $mediaId[$key] = ['is_cover' => true]; } else { $mediaId[$key] = $key; }
Alexandre #lbac, il y a 10 ans

Exactement... Je me suis tellement entêté avec les fonctions de tableaux que j'en ai perdu mon php de base. Comme quoi quand on a la tête dans le guidon depuis plusieurs jours on fait rien de bon :/