Laravel 5.4: Can't get data from relationship
I am trying to display the assignee name (foreign key from the Users table) of each ticket, storing each name in an array of two UNION'd tables (Accesses and Reports), but it gives me this error. 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)//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();
});
}
+3
source to share
2 answers
You have to use the collection method 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
source to share
Your question is not entirely clear, but it seems that you actually need a username. This is untested because I don't have a dataset to test. But it has to find the name of all users who have assigned access or assigned state.
$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');
0
source to share