我正在制作一个具有特定当前步骤的订单表,在这种情况下,该步骤是“ NESTEN”,还有其他一些where语句来获取我需要的订单。
因为我不希望一页上有超过400个订单的列表,所以我想使用laravel分页功能,该功能也可以提高超过100.000条记录的列表的性能。 laravel分页可以正常工作,但是问题出在我要使用自己制作的过滤器时。
我创建了一个下拉列表,该列表需要根据列表中订单的物料进行过滤。在表中,我看到了已过滤的订单,但分页的页数和订单数与以前相同。因此,问题在于,从查询中过滤出集合后,分页没有更新。
我已经尝试了一些谷歌搜索,发现了几种解决方案,这些解决方案无法解决我的问题,甚至引起了更多问题...
还添加了$ orders-> filter函数,以删除不符合过滤条件但没有结果的订单...
为使它现在易于理解,我在Route文件中添加了代码。
我的路线如下
Route::get('orders/nesten', function(Request $request) {
$orders = ShopOrder::where([
['ItemCode', 'LIKE', 'CM%'],
['Exact', '=', null],
['Nesting', '=', null],
['IsOnHold', '!=', 1],
['ShopOrderRoutingStepPlanCount', '!=', 0]
])->paginate(50);
$filteredCollection = $orders->filter(function ($order) use($request) {
if($request->exists('material')) {
return $order->getCurrentStep() == 'Nesten'
&& $order->getMaterial() == $request->get('material');
}
return $order->getCurrentStep() == 'Nesten';
});
$orders->setCollection($filteredCollection);
return view('dashboard/actions/Nesten')->with('shopOrders', $orders);
});
在ShopOrder模型中,我将函数-> getMaterial()和-> getCurrentStep()声明为
public function routingStepPlans() {
return $this->hasMany('App\Models\Exact\ShopOrder\RoutingStepPlan', 'ShopOrder', 'ID');
}
public function materialPlans() {
return $this->hasMany('App\Models\Exact\ShopOrder\MaterialPlan', 'ShopOrder', 'ID');
}
public function getCurrentStep() {
$current = $this->routingStepPlans()->where('LineNumber', ($this->timeTransactions()->count() + 1))->first();
if(isset($current->Description)) {
return $current->Description;
}
return 'Afgerond';
}
public function getMaterial() {
$material = $this->materialPlans()->where('ItemCode', 'LIKE', 'TAP%')->first();
if(isset($material->Description)) {
return $material->Description;
}
return '-';
}
最后是视图
<table class="table table-striped table-bordered no-width">
<thead>
<tr>
<th>Order nummer</th>
<th>SKU</th>
<th>Omschrijving</th>
<th>Aantal</th>
<th>Datum</th>
<th>Deadline</th>
<th>Materiaal</th>
<th>DXF?</th>
</tr>
</thead>
<tbody>
@foreach($shopOrders as $shopOrder)
<tr>
<td>{{ $shopOrder->ShopOrderNumber }}</td>
<td>{{ $shopOrder->ItemCode }}</td>
<td>{{ str_replace('Car Mats', '',$shopOrder->Description) }}</td>
<td>{{ $shopOrder->PlannedQuantity }}</td>
<td>{{ $shopOrder->PlannedStartDate }} </td>
<td>{{ $shopOrder->PlannedDate }}</td>
<td>{{ $shopOrder->getMaterial() }}</td>
<td>{{ $shopOrder->hasDxf() }}</td>
</tr>
@endforeach
</tbody>
</table>
{{ $shopOrders->total() }}
{{ $shopOrders->appends(['material' => Request::get('material')])->render() }}
我希望分页时使用orders / nesten?material = Saxony%20Zwart&page = 1作为页面,因为该材料有9个订单。
但是目前它仍然有151页,与去订购/嵌套相同。
答案 0 :(得分:1)
根据我所看到的,您正在从数据库中获取所有记录,然后使用“集合”过滤器对其进行过滤。分页是根据数据库查询结果构建的,因此您应该更新查询以进行过滤。
更新
namespace App\Http\Filters;
use Illuminate\Http\Request;
use Illuminate\Database\Eloquent\Builder;
class AbstractFilter
{
protected $builder;
protected $request;
public function __construct(Request $request)
{
$this->request = $request;
}
public function apply(Builder $builder)
{
$this->builder = $builder;
foreach($this->filters() as $name => $value) {
if(method_exists($this, $name)) {
call_user_func_array([$this, $name], array_filter([$value]));
}
}
return $this->builder;
}
public function filters()
{
return $this->request->all();
}
}
namespace App\Http\Filters;
class OrdersFilter extends AbstractFilter
{
public function material($value = null)
{
if (!is_null($value)) {
// return modified query here (return $this->builder->where....)
}
}
}
public function scopeFilter($query, OrderFilters $filter) {
return $filter->apply($query);
}
$orders = ShopOrder::whereLike('ItemCode', 'CM%')
->whereNull('Exact')
->whereNull('Nesting')
->where('IsOnHold', '!=', 1)
->where('ShopOrderRoutingStepPlanCount', '!=', 0)
->filter(new OrdersFilter($request))
->paginate(50);
您可以跳过所有集合过滤。您还可以向OrdersFilter类添加更多过滤器参数。
注意:我编写的所有内容都未经测试,因此可能存在一些小错误。另外,如果没有数据库结构,我也没有写过材料过滤器,但是您的Model方法可能会更好。
对于过滤材料方法,我会使用类似的方法(如果可行,则不是100%,未经测试):
public function material($value = null) {
if (!is_null($material)) {
return $this->builder->having('', function($query) use ($value) {
return $query->where('ItemCode', 'LIKE', 'TAP%')
->where('description', '=', $value);
})
->having('routingStepPlans', function($query) {
return $query->where('LineNumber', ShopOrder::timeTransactions()->count() + 1)
->where('description', '=', 'Nesten');
});
}
}
答案 1 :(得分:0)
使您的分页继续但保持搜索
{{ $shopOrders->appends(Request::except('page'))->links() }}