2016-02-11 33 views
0

內不存在關係,我有2種型號:Laravel得到尚未更新,或24小時

Users模型hasManyPayments模型

Payments模型belongsToUser模型

我想以獲得一天或者從未支付的用戶。所以最後一個相關的Payment需要大於24小時或根本不存在。

因此,我繼續並創建了一個hasOne幫手模型,以獲得最新的Payment,但我有點卡在下一步。

我基本上希望能夠做到User::needsPayment()-get(),它會返回所有需要支付的用戶,因爲他們還沒有在24小時內付款或從未支付過。

回答

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()應該給你你正在尋找的記錄。

+0

由於某種原因,php版本不工作。它在最後錯過了另一個')',但它仍然保持空着。 SQL版本工作,它很棒。謝謝! – zen

+0

@zen對不起,愚蠢的錯字。我修好了。在StackOverflow框中編碼時無法保證。 :)而不是手動日期的東西,你可以嘗試使用碳代替:'\碳\碳:: now() - > subHours(24)'。或者你可以使用工作的SQL版本。 – patricus