我有2个型号:
Users
模型hasMany
Payments
模型
Payments
模型belongsTo
User
模型
我正在尝试让那些未支付过一天或从未支付过费用的用户。因此,最后一个相关Payment
需要大于24小时或根本不存在。
所以我继续前进并创建了一个hasOne
辅助模型来获取最新的Payment
,但我有点被困在下一步。
我基本上希望能够User::needsPayment()-get()
能够返回所有需要付费的用户,因为他们没有在24小时内付款或者从未付过款。
答案 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()
应该会为您提供所需的记录。