联接表带来错误ID的查询-Laravel

联接表带来错误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和Users,以及一个查询,用于显示用户的记录:

$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*from
records
其中
schedule\u id
=3 order by
用户
asc)@Poxxac什么东西不起作用?你有错误还是什么吗?还有,第二个是
sortBy()
不是
orderBy()
,这不是一个查询,你在这里处理集合。不,结果的顺序是按记录id,而不是按用户名。我觉得很愚蠢,我刚刚添加了一个“$records=”刚开始和现在都很有效哈哈XD没有得出结论说这是最好的解决方案,但在这个具体问题上,这就是问题所在,我会添加一个关系you。哇!这很有效,谢谢!!我正在运行测试,看看是否有什么东西因为新的查询而丢失/损坏,但是如果你需要来自用户表的数据,y您可以将它添加到->选择('records.*,'users.importantColumn')。我现在只想了解这一点:使用“选择”在那里,查询的结果只是记录对象属性,它与用户对象有关系,我仍然可以通过关联在blade上访问用户属性。是吗?是的,但有更好的方法,编辑我的答案。