Я использую Laravel 5.2 и использую таблицу полиморфных отношений для страницы каналов. В ленте есть картинки, статьи и ссылки, которые имеют свои соответствующие модели. Метод контроллера, который я использую для подачи, выглядит следующим образом:
public function index()
{
$allActivity = Activity::get();
$activity = collect();
foreach($allActivity as $act)
{
$modelString = $act->actable_type;
$class = new $modelString();
$model = $class->find($act->actable_id);
$activity->push($model);
}
return view('feed', compact('activity'));
}
и вот представление feed.blade.php
@foreach($activity as $class)
// Gives me the model name so the correct partial view could be referenced
<?php
$split = explode("\\", get_class($class));
$model = lcfirst($split[1]);
?>
@include("partials.{$model}", [$model => $class])
@endforeach
Из-за этой настройки я не могу получить нумерацию страниц, используя метод, описанный в документации Laravel. Как я могу правильно реализовать нумерацию страниц, используя эту настройку? Любая помощь будет принята с благодарностью.
Доступ к вашим отношениям с помощью actable()
отношение, которое вы должны иметь на вашем Activity
модель. Это также поможет вам избежать использования find()
в цикле, как вы, который даст вам проблему N + 1.
В вашей модели деятельности вы должны иметь actable
метод:
class Activity
{
public function actable()
{
return $this->morphTo();
}
}
Тогда, по вашему мнению, вы можете лениво загрузить все полиморфные действующие отношения и перейти к представлению. Вы даже можете сохранить свой взгляд в чистоте и разрешить название модели в map()
функция:
public function index()
{
$activity = Activity::with('actable')->get()->map(function($activity) {
$activity->actable->className = lcfirst(class_basename($activity->actable));
return $activity->actable;
});
return view('feed', compact('activity'));
}
Тогда по вашему мнению:
@foreach($activity as $model)
@include("partials.{$model->className}", [$model->className => $class])
@endforeach
Чтобы запустить это с нумерацией страниц это было бы:
контроллер:
public function index()
{
$activities = Activity::with('actable')->paginate(25);
return view('feed', compact('activities'));
}
Посмотреть:
@foreach($activities as $activity)
@include('partials.'.lcfirst(class_basename($activity->actable)), [lcfirst(class_basename($activity->actable)) => $activity])
@endforeach
Других решений пока нет …