2016-06-11 15 views
7

ho un pezzo di codice come questo:Metodo orderBy non esiste in Laravel Eloquent?

$products = Product::all() 

if ($search_value) { 
    $products = $products->where('name', 'LIKE', "%$search_value%"); 
} 

$products = $products->orderBy('created_at', 'desc')->skip(10)->take(10)->with('tags')->get(); 

ho ottenuto il seguente errore:

BadMethodCallException in Macroable.php line 81: 
Method orderBy does not exist. 

Credo orderBy necessità di seguire Product:: direttamente, ma non può salvare $products = Product::, posso ?

Qualche suggerimento? Grazie.

risposta

11

Si sta tentando di utilizzare il metodo orderBy() nella raccolta Eloquent. Prova ad usare sortByDesc() invece.

In alternativa, è possibile modificare $products = Product::all(); in $products = new Product();. Quindi tutto il tuo codice funzionerà come previsto.

+0

E 'possibile assegnare un 'model' Eloquente (cioè' Product') a '$' dei prodotti, piuttosto che ottenere una collezione che contiene tutti reocrds? – Harrison

+0

Sicuro. Puoi cambiare '$ products = Product :: all();' to '$ products = new Product();' –

+1

Grazie, è esattamente quello che sto cercando. – Harrison

0

Per prima cosa si ottengono i dati all() e si tenta di ordinare quale è errato. Bisogna risolvere questo problema rimuovendo

$products = Product::all() 

e cambiare il codice in qualcosa di simile

if ($search_value) { 
    $products = Product::where('name', 'LIKE', "%$search_value%"); 
} 
else { 
    $products = Product::orderBy('created_at', 'desc')->skip(10)->take(10)->with('tags')->get(); 
} 

auguro che si ottiene idea di modificare il codice.

+0

È il mio attuale lavoro ... ma cerco di evitare di eseguire 'orderBy',' skip', etc due volte – Harrison

0

La tua richiesta è sbagliata.

rimuovere tutto da $products = Product::all() e quindi inserire get() alla fine della query.

7

basta utilizzare il codice di una linea che funzionerà bene

$product= Product::orderBy('created_at','desc')->get();