['except' => 'id'], 'dir' => ['except' => 'asc'], 'page' => ['except' => 1], 'trashed' => ['except' => false] ]; /** * Model to get data from. */ public $model; /** * Array of columns to show */ public array $columns; /** * What colums are sortable */ public array $sort_columns; /** * Default sorting column */ public string $default_sort; /** * If only trashed records should be shown. */ public bool $trashed = false; public $route_create; /** * Route for editing a record (if null, link is omitted) */ public $route_edit; /** * Route for deleting a record (if null, link is omitted) */ public $route_delete; /** * Route for restoring a record (if null, link is omitted) */ public $route_restore; /** * How many records should be displayed on one page. */ public int $itemsPerPage = 30; public function mount(string $model, array $columns, array $sort_columns = [], $default_sort = '', $route_create = null, $route_edit = null, $route_delete = null, $route_restore = null) { $this->model = app()->make($model); $this->default_sort = $default_sort; $this->sort = $this->default_sort; $this->sort_columns = $sort_columns; $this->route_create = $route_create; $this->route_edit = $route_edit; $this->route_delete = $route_delete; $this->route_restore = $route_restore; $this->setTrashedColumns(); } /** * Render the datatable */ public function render() { $query = $this->model->query(); // Check colums for "dot-notated" strings. // as we want to eager load those relationships foreach ($this->columns as $col => $_) { $p = strrpos($col, '.'); if ($p !== false) { $rel = substr($col, 0, $p); $query->with($rel); } } // Apply sorting. $this->sortApply($query); $items = $query->paginate($this->itemsPerPage); return view('livewire.datatable', ['items' => $items]); } public function toggleTrashed() { $this->trashed = !$this->trashed; $this->setTrashedColumns(); } private function setTrashedColumns() { if ($this->trashed) { // Add deleted_at columns. $this->columns['deleted_at'] = 'Deleted at'; $this->sort_columns['deleted_at'] = 'deleted_at'; } else { // Unset deleted_at columns. unset($this->columns['deleted_at']); unset($this->sort_columns['deleted_at']); // if delete_at was the sorting column // revert back to default sorting. if ($this->sort == 'deleted_at') { $this->sort = $this->default_sort; } } } public function getRouteKeyProperty() { return Str::slug(get_class($this->model)); } }