>我有 2 个模型:
Users
模型hasMany
Payments
模型
Payments
模型belongsTo
User
模型
我试图吸引一天以上没有付款或从未付款的用户。 因此,最后一个相关Payment
需要大于 24 小时,或者根本不存在。
所以我继续创建了一个hasOne
帮助程序模型,只获取最新的Payment
,但我有点卡住了下一步该去哪里。
我基本上希望能够做User::needsPayment()-get()
它会返回所有需要付费的用户,因为他们在 24 小时内没有收到付款或从未收到过付款。
不需要hasOne
。您可以使用现有关系和User
模型上的查询范围轻松执行此操作:
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()
应提供要查找的记录。