这真让我抓狂。
我有两个表:记录和用户以及用于记录用户的查询:
$records = Record::with('user')
->join('users', 'users.id', '=', 'records.user_id')
->orderBy('users.name', 'asc')
->where('schedule_id', $schedule->id)
->get();
dd($records);
给我带来了这个:
Collection {#827 ▼
#items: array:6 [▼
0 => Record {#773 ▼
#connection: "mysql"
#table: null
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
#perPage: 15
+exists: true
+wasRecentlyCreated: false
#attributes: array:13 [▼
"id" => 26
"user_id" => 26
"schedule_id" => 3
"start_time" => "12:00"
"end_time" => "20:00"
"created_at" => null
"updated_at" => null
"name" => "Ali Fay"
"email" => "[email protected]"
"password" => ""
"role_id" => 6
"store_id" => 3
"remember_token" => null
]
如您所见,两个模型的属性都可以,除了“id”,即用户的id,而不是记录。我做错了什么?
你不需要在这里使用join()
:
$records = $schedule->records()->with('user')->get();
然后对集合进行排序:
$records->sortBy(function($i) {
return $i->user->name;
});
具体问题是这种情况,你在连接中有两个名为id的列,所以选择你需要的列,只选择一个id,可以很容易地解决这个问题,如果需要用户的列,你可以根据需要选择它们。
$records = Record::with('user')
->join('users', 'users.id', '=', 'records.user_id')
->orderBy('users.name', 'asc')
->where('schedule_id', $schedule->id)
->select('records.*')
->get();
最好的解决方案是使用关系,所以如果model
类似于。
public class record
{
public function user() {
return $this->belongsTo('App\User');
}
}
然后你可以做同样的查询。 WhereHas
检查是否存在与给定条件的关系,否则如果没有条件,则可以使用has
。
Record::whereHas('user', function ($query) use($schedule){
$query->where('schedule_id', $schedule->id);
})->get()->sortBy(function($item, $key) {
return $item->user->name;
});