【问题标题】:Where expiry date is 7 days ago, and there are no others active到期日期是 7 天前,并且没有其他活动
【发布时间】:2015-10-26 00:40:40
【问题描述】:

所以我正在检查“标签”是否已在 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();

【问题讨论】:

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


    【解决方案1】:

    您可以编写一个子查询来提取仍然处于活动状态的标签:

    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 的经验,所以我不确定如何为你转换它,但我希望这能让你走上正轨。

    【讨论】:

    • 我认为这是我需要走的路,但我很难找到使用 QB 编写它的最佳方式。
    • @dcolumbus 也许不在连接中这样做会更容易,你能把它放在 where 子句中吗? ->where('tags.id', 'not in', '...') ?我希望我能在 QB 中提供更多帮助,对不起。
    【解决方案2】:

    可能是这样的

    $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();
    

    【讨论】:

    • 您的查询中没有提到“seven_days_ago_start”。
    • 我添加了一天的开始和结束。
    • 遗憾的是这对我没有任何结果。
    • 查看更新。我错误地使用了两个 where 子句。基本消除所有记录。
    • 这仍然没有为我生产任何东西。我已经修改了我的用户帐户中的标签,以便应该有结果,但我什么也没得到。
    猜你喜欢
    • 2018-10-25
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 2019-03-03
    • 1970-01-01
    • 2023-02-23
    相关资源
    最近更新 更多