Laravel 5.3 查询 - 左连接一些 table
Laravel 5.3 Query - Left join some table
我正在尝试从“采访”table 中获取每个 candidate_id 的最新记录。
这就是我想要实现的目标:
我在 laravel 上使用 Eloquent 并且已经尝试过这些方法(使用和不使用 eloquent):
$candidates = DB::table('interviews')->select('interviews.*', 'i2.*')
->leftJoin('interviews as i2',
function ($join) {
$join->on('interviews.candidate_id', '=', 'i2.candidate_id');
$join->on('interviews.created_at', '<', 'i2.created_at');
}
)
->whereNull('i2.candidate_id')
->get();
和 eloquent 我试过这个:
$candidates = Interview::leftJoin('interviews as i2',
function ($join) {
$join->on('interviews.candidate_id', '=', 'i2.candidate_id');
$join->on('interviews.created_at', '<', 'i2.created_at');
}
)->whereNull('i2.candidate_id')
->get();
如果我将 get()
更改为 toSql()
我的查询与上图中显示的查询完全相同,但是 运行 在 laravel 我总是得到这些结果(使用第一种方法,使用查询生成器):
有人知道我为什么会得到这个结果吗?很难理解 laravel 正在执行与我在 HeidiSql 中执行的相同的查询,但我得到不同的结果:(
有什么建议吗?
提前致谢!
因为您正在使用 ->select('interviews.*', 'i2.*')
结合 ->whereNull('i2.candidate_id')
我假设第二个 select 参数覆盖 table 和 nulls
采访中的所有字段,请尝试将顺序颠倒为 ->select('i2.*','interviews.*')
或根本不使用 i2.*
。
这是因为输出忽略了别名,只使用字段名作为返回集合中的元素键。
希望有用。
完美案例场景,您可以从每个连接的 table 中选择您想要的确切列,例如它可能是这样的:table1.id,table1.column1,table1.column2,table2.column2 as smth_so_it_doesnt_override
我正在尝试从“采访”table 中获取每个 candidate_id 的最新记录。
这就是我想要实现的目标:
我在 laravel 上使用 Eloquent 并且已经尝试过这些方法(使用和不使用 eloquent):
$candidates = DB::table('interviews')->select('interviews.*', 'i2.*')
->leftJoin('interviews as i2',
function ($join) {
$join->on('interviews.candidate_id', '=', 'i2.candidate_id');
$join->on('interviews.created_at', '<', 'i2.created_at');
}
)
->whereNull('i2.candidate_id')
->get();
和 eloquent 我试过这个:
$candidates = Interview::leftJoin('interviews as i2',
function ($join) {
$join->on('interviews.candidate_id', '=', 'i2.candidate_id');
$join->on('interviews.created_at', '<', 'i2.created_at');
}
)->whereNull('i2.candidate_id')
->get();
如果我将 get()
更改为 toSql()
我的查询与上图中显示的查询完全相同,但是 运行 在 laravel 我总是得到这些结果(使用第一种方法,使用查询生成器):
有人知道我为什么会得到这个结果吗?很难理解 laravel 正在执行与我在 HeidiSql 中执行的相同的查询,但我得到不同的结果:(
有什么建议吗?
提前致谢!
因为您正在使用 ->select('interviews.*', 'i2.*')
结合 ->whereNull('i2.candidate_id')
我假设第二个 select 参数覆盖 table 和 nulls
采访中的所有字段,请尝试将顺序颠倒为 ->select('i2.*','interviews.*')
或根本不使用 i2.*
。
这是因为输出忽略了别名,只使用字段名作为返回集合中的元素键。
希望有用。
完美案例场景,您可以从每个连接的 table 中选择您想要的确切列,例如它可能是这样的:table1.id,table1.column1,table1.column2,table2.column2 as smth_so_it_doesnt_override