2017-07-31 14 views
3

2つのUNIONのテーブル(アクセスとレポート)から各名前を配列に格納することによって、各チケットの譲受人(外部テーブルからの外部キー)の名前を表示しようとしています)しかし、それは私にこのエラーを与える。 ErrorException 未定義のプロパティ:stdClass :: $ assignee。Laravel 5.4:リレーションシップからデータを取得できません

//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)//store in array to display in a chart 
    { 
     $names[] = $one->assignee->name; //error here 
    } 




    //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(); 
    }); 
    } 

It gives me this error

The results should be like this

+0

モデルのクエリではなく、 'DB'ファサードを使用しています。だからあなたはどんな関係にもアクセスするつもりはない。 – fubar

+0

譲受人の名前がほしいのですか?もしそうなら、なぜすべてのフィールドを照会するのですか?そうでない場合は、質問に情報を追加してください。 – fubar

答えて

0

あなたは、コレクションのmerge方法使用する必要があります:あなたの質問は、必ずしも明らかではないが、あなたが唯一の実際の名前を必要としているようです

$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); 
+0

しかし、私は雄弁を使用する場合、テーブルには同じ数の列がないため、共用体は機能しません。 –

+0

私の答えを更新、それはあなたを助けるかもしれません。 @GrantGubatan –

+0

@GrantGubatanこれは動作しません。偏見のないコレクションは、モデルの主キーに基づいて結果をマージします。同じ主キーが両方の結果セットに存在する場合、それらは上書きされます。 – fubar

0

をユーザーの テストするデータセットがないため、これはテストされていません。しかし、割り当てられたアクセスまたは割り当てられた状態を持つすべてのユーザーの名前を見つける必要があります。

$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'); 
関連する問題