Besoin d'aide ?

sync table pivot

  • Avatar de Girly_dev
    Membre depuis :
    01/09/2018
    Messages :
    17

    Bonjour,

    Je suis bloqué sur un script si quelqu'un peut m'aider

    J'ai 4 tables
    tble_tmp : id,nom,prenom, identifiant, prduitA, produitB,produitC,date

    table userClient : id, nom,prenom

    table nomProduit ( id, nom, description)

    table nomProduit_userClient ( id, id_userClient, id_nomProduit, date)

    class userClient extends Model {

    public function produit(){

    return $this->belongsTo(NomPrduit::class, 'nomProduit_userClient','id_userClient', id_nomProduit)->withPivot('date')
    }

    class userClient extends Model {

    public function produit(){

    return $this->belongsTo(userClient::class);

    }

    }
    mon code

    $tbl_tmp = tbl_tmp::all();
    $produitNom = ProduitNom::all()
    foreach ( $ tbl_tmp as $value){

    insert in table userClien identifiant(en tant que id), nom, prenom

    ici je bloque car je dois verifier dans la tbl_tmp si les noms prduits correspondent aux noms de la table nomProduit
    il me recupere l'id de ce nom
    et je fais ma sync
    $user=UserClient::find($value->identifiant)
    $user->produits()->sync ([id du produit=>['date'=>$value->date] ]

    j

    }

    mon souci je n'arrive pas à recuperer l'id et si je fais une boucle pour le recuperer l'id ne boucle pas dans la sync
    il me recupere un seu id et la page est en chargement continue jusqu'à que sa plante et me le met à tout les utilisateur soit il me recupere tous les ids_produits mais il donne un id_produit par utilisateur sachant qu'un utilisateur peut avoir plusieurs id_produit je ne sais pas si j'ai été clair :(

    Merci

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2178

    Bonsoir,

    J'ai du mal à comprendre comment la base est organisée, en fait la table tble_temp. Il me semble comprendre que l'identifiant est une clé étrangère qui réfère l'userClient. Par contre les champs produitsA, B et C là je ne vois pas trop... Il me semble qu'il s'agit de noms de produits...

    Quele st le processus de remplissage de cette table temporaire ? Pourquoi ne pas directement renseigner la table pivot ?

  • Avatar de Girly-dev
    Membre depuis :
    14/09/2018
    Messages :
    12

    en fait c'est un fichier excel que j'importe et que j'insere dans la table tmp, cette table n'a pas de clé etrangere et de cette table tmp j'insere et update des données que j'ai besoins dans userClient en me servant de l'identifiant comme id.

    les prduit A, B , C de ma table tmp on les retrouves dans la colone nom de la table produit
    genre table produit

    id nom
    1 A
    2 B
    3 C

    table tmp

    id identifiant nom prenom produitA produitB produit C date
    1 456 toto toto A B C 20/03/2017
    2 26 michel Pol Null C 20/03/2017
    3 56 David Mal A B Null 20/03/2017
  • Avatar de Girly-dev
    Membre depuis :
    14/09/2018
    Messages :
    12

    Désolé je n'ai pas trouvé comment iserer un tableau

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2178

    Je vois un peu mieux le but recherché.

    Donc tu arrives à remplir la table userClient avec les éléments de la table temporaire.

    Ensuite tu dois pour chaque produit de la table temporaire aller chercher l'id correspondant dans la table des produits. Avec une simple requête tu peux trouver un id :

    $id = Produit::whereNom($nomA)->firstOrFail()->id;

    Mais comme tu cherches plusieurs id :

    $ids = Produit::whereIn('nom', [$nomA, $nomB, $nomC])->pluck('id);

    Enfin si j'ai bien compris...

  • Avatar de Girly_dev
    Membre depuis :
    01/09/2018
    Messages :
    17

    Oui tout à fait mais comment je fais syncroniser ce tableau avec mon champ date et qu'il me recupere la bonne date ?

    $user->produits()->sync ([tableaux d'ids=>['date'=>$value->date] ]

    ['1' =>['date'=>$value->date,
    '2' =>['date'=>$value->date,
    '3' =>['date'=>$value->date
    ]

    public function test(){

    $donnees = DB::table('tbl_tmp')->get();

    foreach ($donnees as $data ){
    $ids = Produits::whereIn('nom', [$data->nomA, $data->nomB, $data->nomC])->pluck('id');
    $arr []= ['date'=>$data->date];

    $dataids = array_combine($ids, $arr);

    print_r($dataids);
    infoUsers::saveData($data->identifiant,$data->nom,$data->prenom);

    }

    }

    Avec ceci

    public function test(){

    $donnees = DB::table('tbl_tmp')->get();

    foreach ($donnees as $data ){

    $id_user = infoUsers::find($data->identifiant);
    $ids = Produits::whereIn('nom', [$data->nomA, $data->nomB, $data->nomC])->pluck('id');
    $hbls =Produits::where('id',$ids)->first();

    infoUsers::saveData($data->identifiant,$data->nom,$data->prenom);
    foreach ($ids as $val){
    $hbls =Produit::where('id',$val)->first();
    if($data->nomA !==null)
    // echo 'ids de pdt ;'.$hbls->id.'<br>';
    $var =$hbls->pers()->sync([$id_user->id=>['date'=>$data->date]]);
    print_r($var);

    }

    quand j'affiche la $var

    j'ai ça

    Array ( [attached] => Array ( ) [detached] => Array ( ) [updated] => Array ( [0] => 105 ) ) Array ( [attached] => Array ( [0] => 105 ) [detached] => Array ( [0] => 39 ) [updated] => Array ( ) ) Array ( [attached] => Array ( [0] => 105 ) [detached] => Array ( [0] => 39 ) [updated] => Array ( ) ) Array ( [attached] => Array ( [0] => 3209 ) [detached] => Array ( [0] => 105 ) [updated] => Array ( ) ) Array ( [attached] => Array ( [0] => 3209 ) [detached] => Array ( [0] => 105 ) [updated] => Array ( ) ) Array ( [attached] => Array ( [0] => 15 ) [detached] => Array ( [0] => 105 ) [updated] => Array ( ) ) Array ( [attached] => Array ( [0] => 39 ) [detached] => Array ( [0] => 3209 ) [updated] => Array ( ) ) Array ( [attached] => Array ( [0] => 39 ) [detached] => Array ( [0] => 3209 ) [updated] => Array ( ) )

    il ne m'insere pas les premiers users, pourquoi il attach et détache ?

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2178

    La fonction sync est destinée à synchroniser les données en relation. IL faut donc lui transmettre tous les id d'un coup, sinon ça va à chaque fois supprimer ce que tu as mis avant. Dans ton cas il faut utiliser attach.

  • Avatar de Girly_dev
    Membre depuis :
    01/09/2018
    Messages :
    17

    Justement les données sont désitinées à changer dans le temps normalement d'ou l'utilisation du sync du coup là ca marche j'ai juste utiliser false en second parametre du sync, je n'arrive pas reelement à comprendre la difference entre sync et attach j'ai regarder la donc mais quand on veut utiliser une table pivot qui sera amené à changer dans le temps on utilise sync car si j'utilise attach il m'ajoutera d'autres lignes au lieu de les editer c'est ca ?

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2178

    Avec attach on ajoute des lignes sans rien changer aux existantes.

    Avec sync on retire toutes les lignes existantes et on met celles transmises dans le sync. En gros on synchronise ce qui est mémorisé avec les informations qu'on veut y trouver.

  • Avatar de Girly_dev
    Membre depuis :
    01/09/2018
    Messages :
    17

    Merci bestmomo pour l'explication c'est beaucoup plus clair :)

  • Avatar de Girly_dev
    Membre depuis :
    01/09/2018
    Messages :
    17

    .

Vous ne pouvez pas répondre à ce sujet.