3 votes

Laravel 5.4: Impossible de récupérer des données d'une relation

Je tente d'afficher le nom du destinataire (clé étrangère de la table Users) de chaque ticket en stockant chaque nom dans un tableau à partir de deux tables UNION (Accesses et Reports) mais cela me donne cette erreur. ErrorException Undefined property: stdClass::$assignee.

//HomeController
    $accesses = DB::table('accesses')
                ->select(array('id', 'fullname','emp_id','shift','state','resolved_at', 'closed_at','assigned_to'))
                ->where('state','=','Assigned');

    $all = DB::table('reports')
                ->select(array('id', 'fullname','emp_id','shift','state','resolved_at', 'closed_at','assigned_to'))
                ->union($accesses)
                ->where('state', '=', 'Assigned')
                ->get();

    $names[] = array();

    foreach ($all as $one)//stocker dans un tableau pour afficher dans un graphique
    {
      $names[] = $one->assignee->name; //erreur ici
    }

   //Report Model
   public function assignee()
   {
      return $this->belongsTo(User::class, 'assigned_to');
   }

   //Access Model
   public function assignee()
   {
      return $this->belongsTo(User::class, 'assigned_to');
   }

  //Report Migration
  public function up()
  {
    Schema::create('reports', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('user_id')->nullable();
        $table->string('fullname');
        $table->string('emp_id');
        $table->string('shift');
        $table->longText('report');
        $table->string('status')->default('Pending'); //Pending, Approved
        $table->string('state')->default('Open'); //Open, Assigned, Resolved, Closed
        $table->date('resolved_at')->nullable();
        $table->date('closed_at')->nullable();
        $table->integer('assigned_to')->nullable();
        $table->longText('action')->nullable();
        $table->timestamps();
    });
   }

   //Access Migration
   public function up()
   {
    Schema::create('accesses', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('user_id')->nullable();
        $table->string('fullname');
        $table->string('emp_id');
        $table->string('shift');
        $table->string('request');
        $table->longText('note')->nullable();
        $table->string('status')->default('Pending'); //Pending, Approved
        $table->string('state')->default('Open'); //Open, Assigned, Resolved, Closed
        $table->date('resolved_at')->nullable();
        $table->date('closed_at')->nullable();
        $table->integer('assigned_to')->nullable();
        $table->longText('action')->nullable();
        $table->timestamps();
    });
   }

Cela me donne cette erreur

Les résultats devraient être comme ceci

0voto

Cong Chen Points 1536

Vous devriez utiliser la méthode merge de la collection :

$accesses = Access::select(array('id', 'fullname','emp_id','shift','state','resolved_at', 'closed_at','assigned_to'))
            ->where('state','=','Assigned')
            ->get();

$reports = Report::select(array('id', 'fullname','emp_id','shift','state','resolved_at', 'closed_at','assigned_to'))
            ->where('state', '=', 'Assigned')
            ->get();

$all = $accesses->merge($reports);

0voto

fubar Points 10111

Votre question n'est pas tout à fait claire, mais il semble que vous ayez seulement besoin du nom de l'utilisateur. Ceci n'est pas testé, car je n'ai pas de jeu de données pour tester. Mais cela devrait trouver le nom de tous les utilisateurs qui ont un accès attribué ou un état attribué.

$names = DB::table('users')
    ->select('users.name')
    ->leftJoin('accesses', function ($join) {
        return $join->on('users.id', '=', 'accesses.assigned_to')
            ->where('accesses.state', '=', 'Assigned');
    })
    ->leftJoin('reports', function ($join) {
        return $join->on('users.id', '=', 'reports.assigned_to')
            ->where('reports.state', '=', 'Assigned');
    })
    ->where(function ($query) {
        return $query->whereNotNull('accesses.id')
            ->orWhereNotNull('reports.id');
    })
    ->groupBy('users.id');

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X