在Laravel中,雄辩(Eloquent)查询构建器提供了一种优雅的方式来处理数据库操作。当你需要创建一个可过滤和可搜索的订单列表时,你可以利用Eloquent的特性来实现这一需求。
Eloquent ORM:Laravel的默认ORM,它允许开发者以面向对象的方式与数据库交互。
查询构建器:提供了一种流畅的接口来创建和执行数据库查询。
本地作用域:允许你在模型中定义可重用的查询片段。
假设我们有一个Order
模型,并且我们想要创建一个可过滤和可搜索的订单列表。
class Order extends Model
{
// ...
// 定义本地作用域
public function scopeFilter($query, $filters)
{
if ($filters['status']) {
$query->where('status', $filters['status']);
}
if ($filters['date_range']) {
$dates = explode(' - ', $filters['date_range']);
$query->whereBetween('created_at', $dates);
}
}
public function scopeSearch($query, $keyword)
{
return $query->where(function ($query) use ($keyword) {
$query->where('order_number', 'LIKE', '%' . $keyword . '%')
->orWhere('customer_name', 'LIKE', '%' . $keyword . '%');
});
}
}
class OrderController extends Controller
{
public function index(Request $request)
{
$filters = $request->only(['status', 'date_range']);
$keyword = $request->input('keyword');
$orders = Order::filter($filters)->search($keyword)->paginate(10);
return view('orders.index', compact('orders'));
}
}
<!-- orders/index.blade.php -->
<form action="{{ route('orders.index') }}" method="GET">
<!-- 过滤条件 -->
<select name="status">
<option value="">All Statuses</option>
@foreach (['pending', 'completed', 'cancelled'] as $status)
<option value="{{ $status }}" {{ request()->input('status') == $status ? 'selected' : '' }}>
{{ ucfirst($status) }}
</option>
@endforeach
</select>
<input type="text" name="date_range" placeholder="Date Range (YYYY-MM-DD - YYYY-MM-DD)" value="{{ request()->input('date_range') }}">
<!-- 搜索框 -->
<input type="text" name="keyword" placeholder="Search by Order Number or Customer Name" value="{{ request()->input('keyword') }}">
<button type="submit">Filter/Search</button>
</form>
<!-- 显示订单列表 -->
@foreach ($orders as $order)
<div>
<h3>Order #{{ $order->order_number }}</h3>
<p>Customer: {{ $order->customer_name }}</p>
<p>Status: {{ ucfirst($order->status) }}</p>
<p>Created At: {{ $order->created_at->format('Y-m-d') }}</p>
</div>
@endforeach
<!-- 分页 -->
{{ $orders->links() }}
问题:过滤或搜索功能不起作用。
原因:
解决方法:
dd()
)来检查查询构建过程。通过上述步骤,你可以创建一个功能齐全且易于维护的可过滤和可搜索的订单列表。
领取专属 10元无门槛券
手把手带您无忧上云