2016-02-04 37 views
7

Korzystanie z zakresu modelularavel modelu zakres activated_at i deactivated_at sprawdzić, czy ma różnicy 7 dni

public function scopeApproved($query) 
{ 
    return $query->where('activated_at', '>=', 'deactivated_at' -7 days); 
} 

wiem, że to jest nieważne składni, ale pomyślałem, że może to być jasne, co próbuję osiągnąć.

„activated_at” i „deactivated_at” są dwa pola w tej samej tabeli i chciałby, aby wszystkie przypadki, w których są one więcej niż 7 dni od siebie

+0

Jakie jest oczekiwane zachowanie, gdy jedna lub obie kolumny mają wartość NULL? – BrokenBinary

Odpowiedz

2

nie jestem pewien, że jest to właściwa droga do osiągnięcia tego celu przez Eloquent, ale możesz użyć funkcji MySQL DATEDIFF. Spróbuj czegoś takiego:

// in your model 
public function scopeApproved($query) { 
    $query->whereRaw("DATEDIFF('activated_at','deactivated_at') >= 7"); 
} 

To zależy od sterownika bazy danych używasz (tj MySQL, SQLite, serwer SQL, ...).

EDIT:

znalazł coś innego że działa (jak dotąd) z MySQL:

// in your model 
public function scopeApproved($query) { 
    $query->whereRaw("TO_DAYS(activated_at) - TO_DAYS(deactivated_at) >= 7"); 
} 

TO_DAYS bycia budować w funkcji MySQL.

+0

to nie działa. –

+0

Czy próbowałeś bez cudzysłowów otaczających pola? Podobnie jak '$ query-> whereRaw (" DATEDIFF (activated_at, deactatate)> = 7 ");' – shempignon

+0

yes. próbowałem tego bez powodzenia. –

3

Shempigon odpowiedź jest prawie poprawne to ma tylko jeden problem, nie zawijać nazwy kolumn w pojedynczy cudzysłów, a także terminy muszą być włączone, coś takiego:

public function scopeApproved($query) { 
    $query->whereRaw("DATEDIFF(deactivated_at, activated_at) >= 7"); 
} 

To dlatego oczekuje to wejście: DATEDIFF(endDate, starDate), możesz przeczytać więcej o DATEDIFF here