['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; } /** * 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 getRouteKeyProperty() { return Str::slug(get_class($this->model)); } }