Код: Выделить всё
RecipeList.php
Что отличается от компонентов?
Код: Выделить всё
class RecipeList extends Component
{
public $sort = 'popularity';
public $dish_category = '';
public $dish_subcategory = '';
public $cuisine = '';
public $menu = '';
protected $queryString = [
'dish_category',
'dish_subcategory',
'cuisine',
'menu',
];
public function mount(RecipeFilterRequest $request): void
{
// mount component
}
public function render()
{
$recipes = $this->getFilteredRecipes();
return view('livewire.recipe-list', ['recipes' => $recipes]);
}
public function getFilteredRecipes(): LengthAwarePaginator
{
// Filter logic using URL parameters
$query = Recipe::with('...');
// Sort filtered recipes using $this->sort
if ($this->sort == 'popularity') {
$query->orderByDesc('likesCount');
} elseif {
// order logic for newest & oldest
// ...
}
return $query->paginate(3);
}
}
Код: Выделить всё
{{-- Dropdown filter --}}
Sort by:
By Popularity
Newest
Oldest
{{-- Pagination --}}
{{ $recipes->links(data: ['scrollTo' => false]) }}
{{-- Recipes--}}
@forelse($recipes as $recipe)
id }}">
@empty
empty
@endforelse
Я создал черту hassortingandpagination.php :
Код: Выделить всё
trait HasSortingAndPagination
{
// Default sorting parameter
public string $sort = 'popularity';
// Sorting logic
public function applySorting(Builder $query): Builder
{
return match ($this->sort){
'popularity' => $query
->orderByDesc('savedCount')
->orderByDesc('likesCount')
->orderBy('dislikesCount')
->orderByDesc('created_at'),
'newest' => $query->orderByDesc('created_at'),
'oldest' => $query->orderBy('created_at'),
default => $query, // user types ?sort=foobar => error
};
}
// Pagination logic
public function paginateQuery(Builder $query, $perPage = 10): LengthAwarePaginator
{
return $query->paginate($perPage);
}
}
Код: Выделить всё
class RecipeList extends Component
{
use WithPagination;
use HasSortingAndPagination;
// public properties are the same
// protected $queryString also the same
public function mount(RecipeFilterRequest $request): void
{
// mount
}
public function render()
{
$recipes = $this->getFilteredRecipes();
return view('livewire.recipe-list', [
'recipes' => $recipes
]);
}
public function getFilteredRecipes(): \Illuminate\Pagination\LengthAwarePaginator
{
// Filter logic using URL parameters
$query = Recipe::with('...');
// Sort filtered recipes using $this->sort
$this->applySorting($query);
// Paginate
return $this->paginateQuery($query, 2);
}
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... livewire-3