Laravel在24小时内获得尚未更新或不存在的关系

时间:2016-02-11 21:52:01

标签: php laravel eloquent

我有2个型号:

Users模型hasMany Payments模型

Payments模型belongsTo User模型

我正在尝试让那些未支付过一天或从未支付过费用的用户。因此,最后一个相关Payment需要大于24小时或根本不存在。

所以我继续前进并创建了一个hasOne辅助模型来获取最新的Payment,但我有点被困在下一步。

我基本上希望能够User::needsPayment()-get()能够返回所有需要付费的用户,因为他们没有在24小时内付款或者从未付过款。

1 个答案:

答案 0 :(得分:1)

不需要hasOne。您可以使用现有关系和User模型上的query scope轻松完成此操作:

class User extends Model {
    // payments relationship method
    public function payments() {
        return  $this->hasMany(Payment::class);
    }

    // query scope
    public function scopeNeedsPayment($query) {
        // constrain to users that don't have a payment in the past 24 hours
        $query->whereDoesntHave('payments', function ($query) {
            // below are two versions of the same statement; pick one.
            // the sql version may be more accurate if your web server and
            // your database server are in different timezones.

            // assumes "paid_at" is your field name

            // php version:
            $query->where('paid_at', '>=', date('Y-m-d H:m:s', strtotime('-24 hours')));
            // sql version:
            $query->whereRaw('paid_at >= DATE_SUB(NOW(), INTERVAL 24 HOUR)');
        });
    }
}

定义了上述查询范围后,您的代码User::needsPayment()-get()应该会为您提供所需的记录。