Merge branch 'task/EXC-324' into 'master'

Join table from frontend

See merge request CIEFWorldwideSdnBhd/shipping-portal!53
This commit is contained in:
omair saleh
2021-09-14 03:45:02 +00:00
4 changed files with 47 additions and 8 deletions
@@ -12,6 +12,8 @@ abstract class AbstractGetRecord
/** @var array */
private const DECORATION_FILTERS = ['per_page', 'order_by'];
private const JOIN_FILTERS = ['joins'];
/** @var Collection */
private $filters;
@@ -20,7 +22,7 @@ abstract class AbstractGetRecord
* @return Collection
*/
private function getQueryFilters(){
return $this->filters->except(self::DECORATION_FILTERS);
return $this->filters->except(array_merge(self::DECORATION_FILTERS, self::JOIN_FILTERS));
}
/**
@@ -30,6 +32,10 @@ abstract class AbstractGetRecord
return $this->filters->only(self::DECORATION_FILTERS);
}
public function getJoinFilters(){
return $this->filters->only(self::JOIN_FILTERS);
}
/**
* @param null|string $json
* @return array
@@ -43,7 +49,13 @@ abstract class AbstractGetRecord
*/
private function applyFiltersToQuery(): Builder
{
return (new ApplyFiltersToQuery())->execute($this->getRepository(), $this->getQueryFilters()->toArray());
$table = $this->getRepository()->getModel()->getTable();
$a = $this->getQueryFilters()->toArray();
$r=[];
array_walk($a, function ($v, $k) use ($table, &$r) { $r[$table.".".$k]=$v; });
return (new ApplyFiltersToQuery())->execute($this->getRepository(), $r);
}
/**
@@ -67,4 +79,4 @@ abstract class AbstractGetRecord
*/
abstract function getResults(Builder $query);
}
}
@@ -6,6 +6,7 @@ namespace App\Classes\General\Eloquent;
use App\Classes\Exceptions\MalformedRequestException;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\Schema;
abstract class AbstractListRecord extends AbstractGetRecord
{
@@ -33,14 +34,40 @@ abstract class AbstractListRecord extends AbstractGetRecord
* @return mixed
*/
public function getResults(Builder $query) {
$filters = $this->getJoinFilters();
$table = $query->getModel()->getTable();
$selects = [];
$selects[] = $table.".*,";
if($filters->has('joins')){
foreach($filters->get('joins') as $join){
$join_table = $join->table;
$columns = Schema::getColumnListing($join_table);
$r=[];
array_walk($columns, function ($v, $k) use ($join_table, &$r) { $r[] = $join_table.".".$v." ".$join_table."_".$v; });
$selects[] = implode(",",$r);
$query = $query->join($join->table, function($q) use($join, $query) {
$q->on($query->getModel()->getTable().'.id', '=', $join->table.'.owner_id');
});
};
$query = $query->selectRaw(implode("",$selects));
}
$filters = $this->getDecorationFilters();
if($filters->has('order_by')){
$query = $query->orderBy($filters->get('order_by')->column, $filters->get('order_by')->DESC ? 'DESC': 'ASC');
$orderByTable = (strpos($filters->get('order_by')->column,".")===false) ? $query->getModel()->getTable()."." : "";
$query = $query->orderBy($orderByTable.$filters->get('order_by')->column, $filters->get('order_by')->DESC ? 'DESC': 'ASC');
}
return $filters->has('per_page') ? $query->paginate($filters->get('per_page')) : $query->get();
}
}
}
@@ -93,4 +93,4 @@
},
mixins: [componentHandler]
}
</script>
</script>
@@ -2,11 +2,11 @@
@section('inner_content')
<div class="row">
<div class="col-7">
<list-component section="warehouseListSection" :endpoint="route('api.packing_list.list')" :options="{type: 1, status: 2, per_page: 20, order_by: {column: 'created_at', DESC: true}}">
<list-component section="warehouseListSection" :endpoint="route('api.packing_list.list')" :options="{type: 1, status: 2, per_page: 20, order_by: {column: 'transport_arrangements.drop_date', DESC: true}, joins: [{table: 'transport_arrangements'}]}">
<template slot="list" slot-scope="{data}">
<parcel-component v-for="packages in data.packages" :data="packages" :key="packages.id"></parcel-component>
</template>
</list-component>
</div>
</div>
@endsection
@endsection