Laravel 6

Affichez une element d'une autre table grace à la clef etrangere Laravel 8

Avatar de maccladdergagne
maccladdergagne

Bonjour je suis nouveau en Laravel. J'aimerais afficher le nom de chaque agent. J'ai prealablement créer une clef étrangère. je pensais pouvoir m'en servir pour recuperer les nom mais j'obitens cette erreur . jécris $rapport->agents_id->nom

Attempt to read property "nom" on int (View: C:\wamp64\www\SET\resources\views\rapport\index.blade.php)

Par contre quand je met $rapport->agents_id ca passe sans probleme. Je veux récuperer le nom de l'agent associé à agents_id.

<?php

namespace App\Http\Controllers;

use App\Http\Requests\RapportRequest;
use App\Models\Agent;
use App\Models\Rapport;
use Illuminate\Http\Request;

class RapportController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(agent $agents, rapport $rapports)
    {
        
        $agents = Agent::all();
        $rapports = Rapport::all();
        
        return view('rapport.index', ['agents' => $agents , 'rapports'=> $rapports
]);
    }
<?php

namespace App\Models;

use App\Models\Agent as ModelsAgent;
use App\Models\Rapport;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;

class Agent extends Model
{
    use HasFactory;

    protected $fillable = [
        'matricule',
        'agents_id',
        'nom',
        'prenom',
        'email'
    ];

    public function Agents() 
{ 
    return $this->hasMany(Rapport::class); 
    
}



}

enfin le model rapport

<?php

namespace App\Models;


use App\Models\Agent;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Factories\HasFactory;

class Rapport extends Model
{
    use HasFactory;
    protected $fillable = [
        'date_stats',
        'nbre_tf_created',
        'nbre_inscription',
        'agents_id',
        'nbre_tf_impacted'
    ];

    public function Rapport()
    { 
        return $this->belongsTo(Agent::class); 
    }

}

Posté il y a 2 mois
Avatar de khalyomede
khalyomede

Bonjour, ton erreur vient du fait que tu essaie d'accéder à une propriété sur un entier. Autrement, je pense qu'il te manque une table entre tes rapports et tes agents, en supposant que la descrption suivante est correcte :

Un rapport peut contenir plusieurs agents, et un agent peut être référencé dans plusieurs rapports.

Si oui, ça signifie que tu dois créer une migration pour ça :

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateRapportAgentTable extends Migration
{
  public function up()
  {
    Schema::create('rapport_agent', function (Blueprint $table) {
      $table->unsignedBigInteger("rapport_id");
      $table->unsignedBigInteger("agent_id");
    
      $table->foreign("rapport_id")->references("id")->on("rapports");
      $table->foreign("agent_id")->references("id")->on("agents");

      // Rajoute d'autres colonnes si nécessaire...

      $table->timestamps();
    });
  }

  public function down(): void
  {
    Schema::dropIfExists('rapport_agent');
  }
}

Ce qui te permettra de déclarer la relation sur ton modèle Rapport :

namespace App\Models;


use App\Models\Agent;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Factories\HasFactory;

class Rapport extends Model
{
  use HasFactory;
  protected $fillable = [
    'date_stats',
    'nbre_tf_created',
    'nbre_inscription',
    'agents_id',
    'nbre_tf_impacted'
  ];

  // Je pense que cette relation n'est pas pertinente
  public function Rapport()
  { 
    return $this->belongsTo(Agent::class); 
  }

  public function agents()
  {
    return $this->belongsToMany(Agent::class, "rapport_agent");
  }
}

Et à ce moment là tu pourras boucler sur les agents de ton rapport :

use App\Models\Rapport;

$rapport = Rapport::first();

foreach ($rapport->agents as $agent) {
  dd($agent->nom);
}

Et pour ajouter un agent sur un rapport :

use App\Models\Rapport;

$rapport = Rapport::first();
$agent = Agent::first();

$rapport->agents()->attach($agent);

Tu as d'autres exemples sur la documentation sur comment ajouter/supprimer des modèles d'une relation belongsToMany ici : https://laravel.com/docs/6.x/eloquent-relationships#updating-belongs-to-relationships

Posté il y a 2 mois
Avatar de AudeMarieKouassy
AudeMarieKouassy

Bonsoir à tous je suis debutante dans le monde Laravel 8. J'ai un problème semblable au sien. J'ai deux tables Auteur et Ouvrage(Un ouvrage ne peut être écrire que par un seul auteur et un auteur peut ecrire plusieurs ouvrages). Je veux pouvoir à partir d'un auteur_id(clé etrangère de Auteur dans la table Ouvrage) recupéré le nom+prénom de l'auteur pour les afficher en même temps sur une page comportant les details sur un ouvrage que j'arrive à afficher grâce une boucle foreach. J'ai regardé les indications ci-dessus mais je ne comprends pas. Pourriez-vous m'aider s'il-vous-plaît

Posté il y a 1 mois
Avatar de khalyomede
khalyomede

Bonjour Aude, peux-tu s'il te plait ouvrir une nouvelle discussion, afin d'y intégrer le code que tu as pour le moment (les modèles et les migrations avec le controlleur qui y est associé dans le meilleur des cas) afin que chacun puisse avoir la chance de t'apporter de l'aide, merci !

Posté il y a 1 mois

Vous ne pouvez pas répondre à ce sujet.