Laravel 5

Aide pour créer relation entre 2 tables et afficher les résultats

  • Avatar de Sinox35
    Membre depuis :
    18/09/2018
    Messages :
    8

    Bonjour , je débute avec le framework Laravel "c'est mon premier framework" , et je suis bloqué pour faire une relation "One To Many"

    mon appli c'est un gestionnaire de candidatures , je voudrais que chaque utilisateur puisque ajouter ses candidatures

    j'ai commencer par créer les relations dans mes migrations dans les table "users" et "candidacy" comme ceci:

    Schema::create('candidacy', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('user_id')->unsigned();
    $table->string('entretien', 3)->default("Non");
    $table->string('statut', 20)->default("En attente");
    $table->string('annonce', 255)->nullable();
    });
    Schema::table('candidacy', function(Blueprint $table) {
    $table->foreign('user_id')->references('id')->on('users')
    ->onDelete('restrict')
    ->onUpdate('restrict');
    });

    et ajouter ceci dans mes 2 models "Candidacy" & "User"

    <?php

    namespace App;

    use Illuminate\Notifications\Notifiable;
    use Illuminate\Foundation\Auth\User as Authenticatable;

    class User extends Authenticatable
    {
    use Notifiable;

    /
    The attributes that are mass assignable.

    @var array
    /
    protected $fillable = [
    'name', 'email', 'password',
    ];

    /

    The attributes that should be hidden for arrays.

    @var array
    /
    protected $hidden = [
    'password', 'remember_token',
    ];

    public function candidacy()
    {
    return $this->hasMany('App\Candidacy');
    }
    }
    <?php

    namespace App;

    use Illuminate\Database\Eloquent\Model;
    use Illuminate\Support\Facades\DB;

    class Candidacy extends Model
    {
    protected $table = 'candidacy';

    public function user()
    {
    return $this->belongsTo('App\user');
    }

    // Affiche les candidatures
    public static function getCandidacys()
    {

    $candidacys = Candidacy::select()
    ->orderBy('date')
    ->simplePaginate(9);

    return $candidacys;
    }
    }

    la ou je bloque c'est pour afficher les candidatures de l'utilisateur , et aussi pour la création

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

    Pour avoir les candidatures d'un user, par exemple si on a son id :

    $user_id = ...
    $CadidacyForUser = Candidacy::whereHas('user', function ($query) use ($user_id) {
    $query->where('users.id', $user_id);
    })->get();

    Pour la création, il y a plusieurs possibilités, par exemple si on a l'id du user comme ci-dessus :

    $user = User::find($user_id);
    $candidacy = new App\Candidacy([
    'annonce' => 'blablabla',
    // autres champs
    ]);
    $user->candidacy()->save($candidacy );
  • Avatar de Sinox35
    Membre depuis :
    18/09/2018
    Messages :
    8

    Bonjour et merci pour ta réponse , entre temps j'avais fait ceci

    // Affiche les candidatures de l'user
    public static function getCandidacys()
    {
    $user= Auth::user();

    $candidacys = $user->candidacy;

    return $candidacys;
    }

    Mais comment puis-je faire pour rajouter une requete avec where? car la ça affiche bien que les candidatures de l'utilisateur connecté ,mais j'aimerais rajouter un where pour trier avec la date etc..

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

    Ca serait peut-être utile de regarder la documentation.

  • Avatar de Sinox35
    Membre depuis :
    18/09/2018
    Messages :
    8

    j'ai reussi à afficher les candidatures de l'user en faisant ceci

    // Affiche les candidatures de l'user
    public static function getCandidacys()
    {
    $user= Auth::user();
    $user_id= $user->id;

    $candidacys = Candidacy::whereHas('user', function ($query) use ($user_id) {
    $query->where('users.id', $user_id)->orderBy('date');
    })->simplePaginate(9);

    return $candidacys;
    }
    manque plus que je test pour la création
  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2472

    Essaie comme ça :

    public static function getCandidacys()
    {
    return Auth::user()->candidacy()->orderBy('date')->simplePaginate(9);
    }
  • Avatar de Sinox35
    Membre depuis :
    18/09/2018
    Messages :
    8

    Un grand merci à toi @bestmomo ça fonctionne parfaitement ce que tu à mis ci-dessus , et pour la création ça fonctione aussi avec ceci

    Auth::user()->candidacy()->save($candidacy);

    encore un truc que j'ai apris grâce à toi , au fur est a mesure je vais pouvoir avancer , en connaisant comment résoudre les problémes que je rencontre .

    Bonne soirée à toi et un grand merci !!!

Vous ne pouvez pas répondre à ce sujet.