2013-09-13 3 views
0

Невероятно новичок в структуре Laravel/фреймворках PHP в целом и решил, что я создам клон Hacker News для моего первого проекта. Однако я столкнулся с некоторой проблемой, когда пытаюсь сортировать результаты по алгоритму сортировки и разбивать на страницы результаты.paginate laravel 4 коллекция & сортировка по динамически сгенерированной переменной

Controller -

public function index() 
{ 
    // tried Story::paginate(10) here instead, results in error 
    $stories = Story::all(); 

    $stories = $stories->sortBy(function($story) 
    { 
     return $story->getScore(); // returns score generated from HN algorithm 
    })->reverse(); 

    return View::make('stories.index')->with('stories', $stories); 
} 

мнение просто "Еогеасп ($ истории как $ истории)" цикла.

Приведенный выше код отлично работает, но не разбит на страницы. Вызов paginate перед sortBy возвращает ошибку (класс Paginator не имеет метода sortBy) и вызов paginate после sortBy также возвращает ошибку.

Итак, как бы я разбивал на страницы результаты и сортировал по динамически сгенерированному счету? Благодарю.

+0

вам нужно использовать 'sortBy', прежде чем он станет объектом' paginator'. не после. – itachi

ответ

1

В качестве предлагаемых комментариев вы можете отсортировать их до того, как они будут разбиты на страницы, а не после (что, вероятно, означает использование SQL для сортировки, если можно, вместо сортировки после факта).

В любом случае, я точно не знаю, что подходит вашему прецеденту из-за недостатка информации. Вот несколько способов использования Paginator object, которые могут вам помочь.

Во-первых, вы можете получить элементы из объекта Paginator:

$stories = Story::paginate(); 
$models = $stories->getItems(); 
// And then sort them... 

Во-вторых, если вам нужно отсортировать элементы, а затем re-paginate them, вы можете сделать это, как хорошо.

$stories = Story::all(); 
$stories->sortBy(...); 

$paginated = Paginator::make($stories, $total, $perpage); 

Ни один из моих решений не будет работать точно для вас - например, последнего примера здесь получает все, а затем пытается сортировать их и постраничными каждую историю в базе данных (вряд ли то, что вы хотите, поражение цели разбиения на страницы).

Надеюсь, это даст вам некоторое представление о том, как использовать объект разбиения на страницы, если это может быть полезно.

Наконец, что я могу предложить сделать, это сделать фоновый процесс (например, командование, выполняемое при задании cron?), Которое оценивает каждую статью и сохраняет ранжированные результаты в кеше. Затем вы можете захватывать идентификаторы истории в определенном порядке из кеша и захватывать их из базы данных. Не пытайтесь загружать каждую историю в базу данных, сортировать ее, а затем возвращать подмножество из них на каждый запрос страницы, сделанный пользователем.

Надеюсь, что помогает.

Смежные вопросы