这让我发疯了。
我有两个表:记录和用户以及带来用户记录的查询:
$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" => "twolff@gmail.com"
"password" => ""
"role_id" => 6
"store_id" => 3
"remember_token" => null
]
正如您所看到的,两个模型的属性都没有问题,除了" id",这是用户的ID,而不是记录。我做错了什么?
答案 0 :(得分:3)
具体问题是这种情况,你在连接中有两个名为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;
});
答案 1 :(得分:2)
您不需要在此使用join()
:
$records = $schedule->records()->with('user')->get();
然后对集合进行排序:
$records->sortBy(function($i) {
return $i->user->name;
});