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

时间:2018-01-09 10:34:48

标签: laravel laravel-5

这让我发疯了。

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

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

2 个答案:

答案 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;
});