spa-laravel-vuejs
spa-laravel-vuejs copied to clipboard
Sorting related column
Is it possible to sort grid by column from different table? For example, I would like to sort grid by customer name on Invoice page:
export default {
name: 'InvoiceIndex',
data() {
return {
...
thead: [
{title: 'Customer', key: 'customer.name', sort: true},
],
}
},
components: {
DataViewer
}
}
I tried to modify FilterPaginateOrder.php
:
public function scopeFilterPaginateOrder($query)
{
...
if($this->isRelatedColumn($request->column)) {
list($relation, $relatedColumn) = explode('.', $request->column);
return $query->whereHas($relation, function($query) use ($relatedColumn, $request) {
$q = $this->filterColumn($query, $request);
return $q->orderBy($relatedColumn, $request->direction);
})
->paginate($request->per_page);
} else {
return $query->orderBy($request->column, $request->direction)
->where(function($query) use ($request) {
return $this->filterColumn($query, $request);
})
->paginate($request->per_page);
}
}
protected function isRelatedColumn($column)
{
return strpos($column, '.') !== false;
}
protected function filterColumn($query, $request)
{
// check if search query is empty
if($request->has('search_query_1')) {
// determine the type of search_column
// check if its related model, eg: customer.id
if($this->isRelatedColumn($request->search_column)) {
list($relation, $relatedColumn) = explode('.', $request->search_column);
return $query->whereHas($relation, function($query) use ($relatedColumn, $request) {
return $this->buildQuery(
$relatedColumn,
$request->search_operator,
$request,
$query
);
});
} else {
// regular column
return $this->buildQuery(
$request->search_column,
$request->search_operator,
$request,
$query
);
}
}
return $query;
}
but the data was not sorted properly.