2014-05-23 6 views
0

J'ai beaucoup de mal à trier puis paginer une collection dans Laravel 4.Trier et paginer une collection

$articles = Article::get(); 
$articles->sortBy('category.name'); 

Je reçois tous les articles et je les trier par nom, mais lorsque je tente Pour ce faire:

$articles->paginate(30); 

Je reçois une erreur. J'ai essayé toutes sortes de variations sur la pagination, comme paginer avant de trier mais ça ne marche pas non plus et toutes sortes d'autres choses.

La relation entre les articles et les catégories est comme ceci:

class Article extends Eloquent { 
    public function category(){ 
    return $this->belongsTo('Category'); 
    } 
} 

class Category extends Eloquent { 
    public function articles(){ 
    return $this->hasMany('Article'); 
    } 
} 

Suis-je manque le tableau d'ici où est mon erreur?

+0

Vous dites "Une erreur est générée" - quel est le message d'erreur? Il est très difficile de diagnostiquer le problème sans le savoir. – Kryten

Répondre

0

Vous devez utiliser paginate immédiatement, sauf s'il y a une raison très précise pour laquelle vous voulez que tout soit récupéré puis manipulé.

$articles = Article::paginate(30); 

ou peut-être

$articles = Article::where('category_id', '=', '5')->paginate(30); 

ou pour le tri

$articles = Article::where('category_id', '=', '5')->sortBy('title')->paginate(30); 

Votre exemple me fait demander: ce qui est sortBy ('category.name') se référant à? vous êtes sur la table des articles, sans référence ou quoi que ce soit à la table des catégories, donc c'est (probablement) faux ... y a-t-il un champ category_id dans la table des articles pour référence à la catégorie? Si vous souhaitez rejoindre la table des catégories et trier les articles par nom de la catégorie, vous devriez essayer quelque chose comme

$articles = Category::where('id', 'IN', '5,6,7,8,9')->articles->paginate(30); 

mais cela présume que vous avez gardé les conventions habituelles, comme ayant la category_id dans les articles, la dénomination correcte des tables ou sinon déclaré les champs de relation, etc.

Il existe des moyens de manipuler une collection récupérée, avec des fermetures. Copier à partir du documentation:

$roles = $roles->sortBy(function($role) 
{ 
    return $role->created_at; 
}); 
+0

Je veux trier les résultats en fonction du nom de la catégorie à laquelle ils appartiennent et les paginer. – Flobbo

+0

Quelle est la structure de votre table? – alou

Questions connexes