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

问题描述 投票:2回答:2

这真让我抓狂。

我有两个表:记录和用户以及用于记录用户的查询:

$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,而不是记录。我做错了什么?

laravel laravel-5
2个回答
2
投票

你不需要在这里使用join()

$records = $schedule->records()->with('user')->get();

然后对集合进行排序:

$records->sortBy(function($i) {
    return $i->user->name;
});

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;
});
© www.soinside.com 2019 - 2024. All rights reserved.