2014-06-30 29 views
6

Ho il modello di News, quando interrogo le notizie, voglio che porti notizie dove status = 1 come predefinito.Laravel Eloquent Query Builder Default Dove Condizione

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

È possibile? Quello che voglio è così simile alla funzione di eliminazione soft (si ottiene dove deleted_at non è nullo e se tutti i dati sono ricercati con la funzione Trashed può essere usata).

Ho guardato i documenti ma non ho trovato nulla di utile. Inoltre, ho provato a gestirlo in costruzione al modello di News, ma non ha funzionato neanche.

Grazie.

+0

non puoi semplicemente estendere la classe padre e sovrascrivere la cui la funzione. (Questa è la parte in cui è possibile aggiungere la logica personalizzata ...) – Kenny

+0

Dipende dalla versione del framework. Per 4.2+ usi semplicemente 'scope globali '. Questo è esattamente ciò di cui hai bisogno ed è così che funziona la funzione 'softDelete' nella v4.2 + –

risposta

14

che normalmente l'override newQuery() per questo. newQuery() è il metodo utilizzato da Eloquent per costruire una nuova query.

class News extends Eloquent { 

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

} 

Ora il vostro News::all() sarà emesso solo le tue notizie con stato = 1.

+1

Ciò aggiunge anche la clausola where a nested wheres. Quindi per evitarlo lo sto usando come segue: 'public function newQuery ($ excludeDeleted = true) { $ query = parent :: newQuery() if (! $ This-> dirty) { $ query-> where (status, '=', 1); } return $ query; } ' Questo è un modo di scelta rapida sporco da gestire, ma consiglio di utilizzare l'ambito globale. – Bilal

+0

Eventuali indizi su come farlo funzionare con le relazioni? Sto affrontando un problema usandolo con whereHas. –

+0

Perché si fa "return parent :: newQuery ($ excludeDeleted = true) -> where (status, '=', 1);" invece di "return parent :: newQuery ($ excludeDeleted) -> where (status, '=', 1);" Sembra il valore passato prima che venga ignorato. –

5

Penso che la chiude si otterrà, senza in realtà andando a modificare alcuni file di base ...

è spazio Query ...

ambiti consentono di riutilizzare facilmente logica di query in i tuoi modelli Per definire un campo di applicazione, è sufficiente anteporre un metodo modello con campo di applicazione:

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

Utilizzando tale ambito

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

La sua non è proprio quello che si voleva ... ma è sicuramente un po 'più breve rispetto a digitare

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

più e più

+0

Grazie per la risposta. Conosco questa funzione ma non aiuta veramente. '' 'Notizie/* condizioni */-> get()' '' è chiamato in così tanti posti. Non voglio cambiare tutte queste righe. – Bilal

+1

Il tuo IDE non ha una funzione di ricerca/sostituzione in cui è possibile cercare tutte le istanze di Notizie :: e aggiornare con News :: status() ->, sembra una semplice soluzione davvero – KyleK

+4

Grazie per il tuo aiuto e senza offesa, ma perché usiamo framework, oop, modelli, viste allora? Penso che forzare tali soluzioni mi insegna molte cose e mi dà flessibilità durante la codifica. Quello che hai detto è l'ultima soluzione per me. – Bilal