2014-06-30 11 views
6

Mam model wiadomości, kiedy zapytanie o wiadomości, chcę, żeby przynosiło wiadomości gdzie domyślnie status = 1.Laravel Eloquent Query Builder Default Domyślnie gdzie stan

News::all(); // select * from news where status = 1 
News::where('anotherColumn',2)->get(); // select * from news where status = 1 and where category = 2 

Czy to możliwe? To, czego chcę, jest tak podobne do funkcji miękkiego usuwania (dostaje się tam, gdzie usunięty_at nie jest pusty i jeśli wszystkie dane są potrzebne, można użyć funkcji Trashed).

Szukałem dokumentów, ale nie mogłem znaleźć niczego przydatnego. Próbowałem też poradzić sobie z tym w konstruktorze w modelu News, ale to też nie zadziałało.

Dzięki.

+0

nie można po prostu rozszerzyć klasę nadrzędną i nadpisać gdzie funkcja. (Jest to część, w której można dodać niestandardową logikę ...) – Kenny

+0

Zależy od wersji ramowej. Dla wersji 4.2+ po prostu używasz "globalnych zakresów". Dokładnie tego potrzebujesz i właśnie w ten sposób funkcja 'softDelete' działa w wersji 4.2 + –

Odpowiedz

14

normalnie zastępują newQuery() do tego. newQuery() to metoda używana przez Eloquent do konstruowania nowego zapytania.

class News extends Eloquent { 

    public function newQuery($excludeDeleted = true) { 
     return parent::newQuery($excludeDeleted) 
      ->where(status, '=', 1); 
    } 

} 

teraz Twój News::all() będzie tylko wyjście Wasze wiadomości o statusie = 1.

+1

To również dodaje klauzul where do zagnieżdżonych wheres. Aby tego uniknąć, używam go poniżej: 'public function newQuery ($ excludeDeleted = true) { $ query = parent :: newQuery() if (! $ This-> dirty) { $ zapytanie-> gdzie (status, "=", 1); } return $ query; } ' To jest bardzo trudny sposób obsługi, ale zalecam używanie zakresu globalnego. – Bilal

+0

Jakieś wskazówki, jak sprawić, by działało to w relacjach? Mam problem z używaniem go z whereHas. –

+0

Dlaczego robisz "return parent :: newQuery ($ excludeDeleted = true) -> gdzie (status, '=', 1);" zamiast tylko "return parent :: newQuery ($ excludeDeleted) -> gdzie (status," = ', 1); " Wygląda na to, że wartość została przekroczona, zanim nastąpi nadpisanie. –

5

myślę, że zamyka się dostaniesz, bez faktycznie dzieje się, by zmienić niektóre podstawowe pliki ...

jest zakres zapytań ...

celownicze pozwalają łatwo re-use w logikę zapytania twoje modele. Aby zdefiniować zakres, wystarczy poprzedzić metodę modelu z zakresu:

class News extends Eloquent { 
    public function scopeStatus($query) 
    { 
    return $query->where('status', '=', 1); 
    } 
} 

Wykorzystując ten zakres

$news = News::status()->get(); 
$news2 = News::status()->where('anotherColumn',2)->get(); 

jego nie całkiem to, czego chciał ... ale jest na pewno trochę krótszy niż wpisując

News::where('status','=',1)->get(); 

kółko

+0

Dzięki za odpowiedź. Znam tę funkcję, ale tak naprawdę nie pomaga. '' 'News/* conditions */-> get()' '' jest wywoływane w tak wielu miejscach. Nie chcę zmieniać wszystkich tych linii. – Bilal

+1

Czy Twój IDE ma funkcję znajdowania/zamiany, w której można po prostu wyszukiwać wszystkie wystąpienia News :: i aktualizować za pomocą News :: status() ->, wydaje się być prostą naprawą naprawdę – KyleK

+4

Dzięki za pomoc i bez urazy, ale dlaczego używamy ram, a więc języka, modeli, widoków? Myślę, że wymuszanie takich rozwiązań uczy mnie wielu rzeczy i daje mi elastyczność podczas kodowania. To, co powiedziałeś, jest dla mnie ostatnim rozwiązaniem. – Bilal

Powiązane problemy