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

Pox*_*xac 2 laravel laravel-5

这真让我抓狂。

\n\n

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

\n\n
$records = Record::with(\'user\')\n        ->join(\'users\', \'users.id\', \'=\', \'records.user_id\')\n        ->orderBy(\'users.name\', \'asc\')\n        ->where(\'schedule_id\', $schedule->id)\n        ->get();\n
Run Code Online (Sandbox Code Playgroud)\n\n

dd($records);给我带来了这个:

\n\n
Collection {#827 \xe2\x96\xbc\n    #items: array:6 [\xe2\x96\xbc\n        0 => Record {#773 \xe2\x96\xbc\n            #connection: "mysql"\n            #table: null\n            #primaryKey: "id"\n            #keyType: "int"\n            +incrementing: true\n            #with: []\n            #withCount: []\n            #perPage: 15\n            +exists: true\n            +wasRecentlyCreated: false\n            #attributes: array:13 [\xe2\x96\xbc\n                "id" => 26\n                "user_id" => 26\n                "schedule_id" => 3\n                "start_time" => "12:00"\n                "end_time" => "20:00"\n                "created_at" => null\n                "updated_at" => null\n                "name" => "Ali Fay"\n                "email" => "twolff@gmail.com"\n                "password" => ""\n                "role_id" => 6\n                "store_id" => 3\n                "remember_token" => null\n            ]\n
Run Code Online (Sandbox Code Playgroud)\n\n

正如您所看到的,除了“id”之外,两个模型的属性都可以,即用户的 ID,而不是记录。我做错了什么?

\n

mrh*_*rhn 6

具体问题是这种情况,您在连接中有两列名为 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();
Run Code Online (Sandbox Code Playgroud)

最好的解决方案是使用关系,所以如果是model类似的东西。

public class record
{
    public function user() {
        return $this->belongsTo('App\User');
    }
}
Run Code Online (Sandbox Code Playgroud)

然后您可以执行与以下相同的查询。WhereHas检查与给定条件的关系是否存在,否则如果不存在条件,则has可以使用。

Record::whereHas('user', function ($query) use($schedule){
    $query->where('schedule_id', $schedule->id);
})->get()->sortBy(function($item, $key) {
    return $item->user->name;
});
Run Code Online (Sandbox Code Playgroud)