到期日期为 7 天前,并且没有其他活动
Where expiry date is 7 days ago, and there are no others active
所以我正在检查 "tag" 是否已在 7 天前过期。但我还想确保 没有任何其他标签 在同一查询中仍然 "valid"。因此,如果还有其他标签连接到 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();
您可以编写一个子查询来提取仍然有效的标签:
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 的经验,所以我不确定如何为您转换它,但我希望这能让您走上正轨。
可能是这样
$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();
所以我正在检查 "tag" 是否已在 7 天前过期。但我还想确保 没有任何其他标签 在同一查询中仍然 "valid"。因此,如果还有其他标签连接到 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();
您可以编写一个子查询来提取仍然有效的标签:
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 的经验,所以我不确定如何为您转换它,但我希望这能让您走上正轨。
可能是这样
$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();