Besoin d'aide ?

Récupérer données des clé étrangères

  • Avatar de ZeDeRo
    Membre depuis :
    03/11/2018
    Messages :
    3

    Bonjour à vous,

    Cela fait maintenant plusieurs heures que je cherche sans trouver de solution fonctionnelle, ou alors c'est moi qui ne sait pas m'y prendre....
    J'ai besoin pour un projet, d'afficher dans un tableau, des contrats, et chaque contrat contient un pigiste enregistré avec un Num. Le problème est que dans le tableau récap, j'aimerai afficher le nom et le prénom de ce pigiste.
    Et c'est là ou ça bloque, normalement, les liens clés étrangères sont faites, mais dans le tableau je n'arrive pas à ressortir les données des pigistes...
    J'espère m'être fait comprendre !

    Edit : Je tiens à préciser que les morceaux rajouté dans les models (hasOne, belongsTo), je les ai trouvé sur la doc de laravel, j'ai essayé d'y faire fonctionner tant bien que mal sans succès....

    La page index ou se trouve le tableau ainsi que son controller :

    class ContratController extends Controller
    {
    /*
    Display a listing of the resource.

    @return \Illuminate\Http\Response
    */
    public function index()
    {
    $contrats=contrats::all();
    $pigistes=pigistes::all();
    return view('contrats.index', compact('contrats', 'pigistes'));
    }
    }
    @foreach($contrats as $key => $value)
    <tr>
    <td>{{$value->Num}}</td>
    <td>{{$value->LettreAccordCollaboration}}</td>
    <td><?php if($value->EtatContrat == 1)
    {
    echo "Non envoyé";
    }
    else if ($value->EtatContrat == 2)
    {
    echo "Envoyé";
    }
    else
    {
    echo "Reçu";
    }
    ?>
    </td>
    <td><?php if($value->Agessa == 0)
    {
    echo "Oui";
    }
    else
    {
    echo "Non";
    }
    ?></td>
    <td><?php if($value->Facture == 0)
    {
    echo "Oui";
    }
    else
    {
    echo "Non";
    }
    ?></td>
    <td>{{$value->Nom}} {{$value->Prenom}}</td>
    <td>{{$value->NumMagazine}}</td>
    <td>

    Le model du contrat :

    class Contrats extends Model
    {
    Public $timestamps = false;

    Protected $primaryKey = 'Num'; // Définir la clé pirmaire

    protected $filliable = [
    Num', 'LettreAccordCollaboration', 'EtatContrat', 'Agessa', 'Facture', 'Montant', 'MontantNet', 'DatePaiement', 'NumPigiste', 'NumMagazine'
    ]; // Autoriser l'ajout dans la BDD depuis le site de ces champs là de la table

    public function Pigistes()
    {
    return $this->hasOne('App\Pigistes', 'NumPigiste', 'Num');
    }
    }

    Et celui du pigiste :

    class Pigistes extends Model
    {
    Public $timestamps = false;

    Protected $primaryKey = 'Num'; // Définir la clé pirmaire

    protected $filliable = [
    'Num', 'Nom', 'Prenom', 'Adresse', 'CP', 'Ville', 'Mail', 'NumSecu', 'ContratCadreCollaboration'
    ]; // Autorister l'ajout dans la BDD depuis le site de ces champs là
    public function Contrats()
    {

    return $this->belongsTo('App\Contrats' , 'Num' , 'NumPigiste');
    }
    }

    Je me doute bien que ce n'est pas optimisé, et sans doute même pas les bonnes normes.. mais c'est ce qu'on nous apprend en cours...!

    Je vous remercie d'avance !

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

    Bonjour,

    Le fait d'ajouter des clés étrangères et des relations ne suffit pas, encore faut-il utiliser ces relations :

    class ContratController extends Controller
    {
    public function index()
    {
    $contrats=Contrats::with('Pigistes')->get();
    return view('contrats.index', compact('contrats'));
    }
    }

    Pour la vue autant bien utiliser Blade et la relation :

    @foreach($contrats as $contrat)
    <tr>
    <td>{{$contrat->Num}}</td>
    <td>{{$contrat->LettreAccordCollaboration}}</td>
    <td>
    @if($contrat->EtatContrat == 1)
    Non envoyé
    @elseif ($contrat->EtatContrat == 2)
    Envoyé
    @else
    Reçu

    ...

    @endif

    ...

    <td>{{$contrat->Pigiste->Nom}} {{$contrat->Pigiste->Prenom}}</td>

    ...

    @endforeach

    Dernière remarque la propriété pour la mass update n'est pas $filliable mais $fillable.

    Ca devrait déjà aller mieux avec ça...

  • Avatar de ZeDeRo
    Membre depuis :
    03/11/2018
    Messages :
    3

    Je m'excuse d'avance pour réponse tardive.

    J'ai mis en place et ça fonctionne très bien ! Je ne savais pas du tout comment ça fonctionne et je comprend mieux grâce à toi !

    Je te remercie donc pour cette erreur.

    Pour ce qui est du fillable, je te remercie aussi, l'ajout fonctionnait malgré que le nom soit différent. Peut être que je me trompe sur son utilisation, est-ce bien pour autoriser l'ajout de données dans la table depuis un formulaire ?

    Cordialement, Zed.

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

    Salut,

    Le $fillable c'est quand on crée ou modifie un enregistrement en bloc avec une methode create ou update. Il pourrait y avoir l'ajout intempestif d'un champ non voulu alors on définit exactement les champs qui sont accessible avec cette methode.

  • Avatar de ZeDeRo
    Membre depuis :
    03/11/2018
    Messages :
    3

    D'accord, il me semblait bien que c'était quelque chose de ce style là.

    Merci pour les réponses, je clos le sujet.

    Bonne journée !

    Edit : Je pensais pouvoir le clore..! Tant pis ! Je marque au moins la réponse correspondant à ma question..!

Vous ne pouvez pas répondre à ce sujet.