到期日是7天前,没有其他人活跃

时间:2015-08-03 19:25:56

标签: mysql database laravel laravel-4 query-builder

所以我要检查7天前“标签”是否已过期。但我还想确保不是在同一查询中仍然“有效”的任何其他标记。因此,如果有其他标记已连接到用户expiry_date将来仍然存在,请忽略该标记。

我的第一部分工作正常:

$seven_days_ago_start = date('Y-m-d', strtotime('-7 days')) . ' 00:00:01';
$seven_days_ago_end = date('Y-m-d', strtotime('-7 days')) . ' 23:59:59';

$expired_tags = DB::table('tags')
        ->leftJoin('users', 'tags.user_id', '=', 'users.id')
        ->leftJoin('pets', 'pets.id', '=', 'tags.pet_id')
        ->where('tags.active', '=', 1)
        ->whereBetween('tags.expiry_date', array($seven_days_ago_start, $seven_days_ago_end))
        ->select('users.id', 'users.username', 'users.email', 'users.first_name', 'tags.serial_number')
        ->get();

2 个答案:

答案 0 :(得分:0)

您可以编写子查询来拉取仍处于活动状态的标记:

SELECT tags.id
FROM tags
WHERE tags.expiry_date > $seven_days_ago_end;

然后,使用NOT IN运算符确保不提取这些标记。您可以将此条件置于联接中:

JOIN users ON tags.user_id = users.id AND tags.id NOT IN(...);

我对Laravel没有经验,所以我不确定如何为你转换它,但我希望这会让你走上正轨。

答案 1 :(得分:0)

也许就像这样

$expired_tags = DB::table('tags')
            ->leftJoin('tags as t', function($join) use ($seven_days_ago_end){
                $join->on('tags.user_id','=','t.user_id')->where('t.expiry_date','>',$seven_days_ago_end);
            })
            ->join('users', function($join){
                $join->on('tags.user_id', '=', 'users.id')->whereNull('t.expiry_date');
            })
            ->leftJoin('pets', 'pets.id', '=', 'tags.pet_id')
            ->where('tags.active', '=', 1)
            ->whereBetween('tags.expiry_date', array($seven_days_ago_start, $seven_days_ago_end))
            ->select('users.id', 'users.username', 'users.email', 'users.first_name', 'tags.serial_number')
            ->get();