联接表带来错误ID的查询-Laravel
这让我快发疯了 我有两个表:Records和Users,以及一个查询,用于显示用户的记录:联接表带来错误ID的查询-Laravel,laravel,laravel-5,Laravel,Laravel 5,这让我快发疯了 我有两个表:Records和Users,以及一个查询,用于显示用户的记录: $records = Record::with('user') ->join('users', 'users.id', '=', 'records.user_id') ->orderBy('users.name', 'asc') ->where('schedule_id', $schedule->id) ->ge
$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”之外,这两个模型的属性都是ok的,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();
最好的解决方案是使用关系,因此如果模型
类似于
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;
});
也许是对的!检查数据库,查看记录是否与用户具有相同的id;)它们没有相同的idsschedule\u id是记录表,而不是用户:(SQLSTATE[42S22]:未找到列:在“order子句”中1054未知列“users.name”(SQL:select*fromrecords
其中schedule\u id
=3 order by用户
asc)@Poxxac什么东西不起作用?你有错误还是什么吗?还有,第二个是sortBy()
不是orderBy()
,这不是一个查询,你在这里处理集合。不,结果的顺序是按记录id,而不是按用户名。我觉得很愚蠢,我刚刚添加了一个“$records=”刚开始和现在都很有效哈哈XD没有得出结论说这是最好的解决方案,但在这个具体问题上,这就是问题所在,我会添加一个关系you。哇!这很有效,谢谢!!我正在运行测试,看看是否有什么东西因为新的查询而丢失/损坏,但是如果你需要来自用户表的数据,y您可以将它添加到->选择('records.*,'users.importantColumn')。我现在只想了解这一点:使用“选择”在那里,查询的结果只是记录对象属性,它与用户对象有关系,我仍然可以通过关联在blade上访问用户属性。是吗?是的,但有更好的方法,编辑我的答案。