我有一个这个方案的许可表:
license_id | licenseKey | update_from
此表包含一些许可证密钥,可以是其他许可证的更新。
update_from
指向数据的id,如果为null,则许可证不是更新。
我如何只选择未用作更新的许可证? (其id不用作update_from)
实施例: 我有这张桌子:
license_id | licenseKey | update_from
1 | XX-XX-XX-XX | null
2 | YY-YY-YY-YY | null
3 | ZZ-ZZ-ZZ-ZZ | 1
根据这些数据,我想选择id为2和3的数据(3是1的更新,所以我不想选择1,因为它已经更新了)
编辑: 使用此代码解决了问题:
$subquery = License::select('update_from')->whereNotNull('update_from')->toSql();
$query->whereRaw('license_id not in (' . $subquery . ')');
我已经有了一个查询$query
,只是用这段代码更新了它。
答案 0 :(得分:2)
我认为这个解决方案更像是“Eloquent-ish”而且不涉及SQL。
$licenses = License::whereNotIn('id',function($query){
$query->from((new License)->getTable())->whereNotNull('update_from')->lists('update_from');
})->get();
答案 1 :(得分:1)
您可以使用子查询来过滤updated_from
不为空的条目:
$subquery = DB::table('license')
->select('update_from')
->whereNotNull('update_from')
->toSql();
$licenses = DB::table('license')
->whereRaw('license_id not in (' . $subquery . ')')
->get();
与Eloquent拥有相同的东西:
$subquery = License::select('update_from')->whereNotNull('update_from')->toSql();
$licenses = License::whereRaw('license_id not in (' . $subquery . ')')->get();
为了更好地理解正在发生的事情,这里是查询生成器生成的查询:
SELECT *
FROM `license`
WHERE license_id NOT IN
( SELECT `update_from`
FROM `license`
WHERE `update_from` IS NOT NULL)
此处还有SQLFiddle使用您发布的架构和示例数据运行此查询。