Laravel Eloquent仅选择未用作外键的数据

时间:2015-09-02 08:05:53

标签: php mysql laravel eloquent

我有一个这个方案的许可表:

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,只是用这段代码更新了它。

2 个答案:

答案 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使用您发布的架构和示例数据运行此查询。