php - 这个雄辩的方法的查询范围?
问题描述
我在我的项目中创建了一个过滤器方法,我使用此方法过滤了数据,但现在我想在 laravel 中使用 queryScope 方法重构代码,谁能建议我如何重构此代码。这段代码工作正常。
这是我的控制器索引方法
public function index(Request $request)
{
$status = Ticket_status::pluck('name');
$tickets = Ticket::with('users','ticketStatus','ticketType','tbl_contacts')
->where('user_id','=',Auth::user()->id)
->latest();
if (request('Open')) {
$tickets = $tickets->where('status_id',1)->get();
} elseif (request('Pending')) {
$tickets = $tickets->where('status_id',2)->get();
} elseif (request('Close')) {
$tickets = $tickets->where('status_id',3)->get();
} else {
$tickets = $tickets->get();
}
return view('ticketing.user.index',compact('tickets','status'));
}
这是我的刀片文件。所有代码都运行良好,但我想进行一些重构
<div class="col-md-8">
<a
href="{{route('tickets.index')}}"
class="btn btn-sm btn-outline-secondary mr-1">
All
</a>
@foreach ($status as $status_name)
<a
href="/tickets?{{Str::lower($status_name)}}={{ Str::lower($status_name) }}"
class="btn btn-sm btn-outline-secondary mr-1">
{{$status_name}}
</a>
@endforeach
</div>
这是我的模型。
<?php
namespace App;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Ticket extends Model
{
use SoftDeletes;
//Table Name
protected $table = 'tickets';
//Primary key
public $primaryKey = 'id';
protected $fillable = [
'ticket_number',
'name',
'description',
'contact_id',
'product_id',
'status_id',
'type_id',
'priority',
'user_id',
'ticket_image',
'start_date',
];
protected $casts = [
'start_date' => 'datetime',
];
protected $dates = [
'start_date',
'deleted_at',
];
protected $filepath = '/storage/';
public function getRouteKeyName()
{
return 'ticket_number';
}
public function setStartDateAttribute($date)
{
$this->attributes['start_date'] = Carbon::parse($date)->format('Y-m-d H:i:s');
}
public function getTicketImageAttribute($value)
{
return asset($value ? $this->filepath.$value: 'uploads/default/products.jpg');
}
public function ticketType() {
return $this->belongsTo( 'App\Ticket_type', 'type_id' );
}
public function ticketStatus() {
return $this->belongsTo( 'App\Ticket_status', 'status_id' );
}
public function tbl_contacts() {
return $this->belongsTo('App\Tbl_contacts', 'contact_id');
}
public function tbl_products() {
return $this->belongsTo('App\Tbl_products', 'product_id');
}
public function users() {
return $this->belongsTo('App\User', 'user_id');
}
public function getPriorityAttribute($value) {
if ($value == 1) {
// return "<span class='dot dot-sm dot-success'></span> Low";
return $value;
} elseif($value == 2) {
// return "<small class='dot dot-sm dot-warning'></small> Medium";
return $value;
} else {
// return "<span class='dot dot-sm dot-danger'></span> High";
return $value;
}
}
/**
* Get all of the Ticket's comments.
*/
public function comments()
{
return $this->morphMany('App\Comment', 'commentable');
}
// public function scopeFilter($query, $filters) {
// if ($stauts = $filters['open']) {
// $query->where('status_id','=',$stauts);
// } elseif ($stauts = $filters['pending']) {
// $query->where('status_id','=',$stauts);
// } elseif ($stauts = $filters['close']) {
// $query->where('status_id','=',$stauts);
// }
// }
}
解决方案
您可以在模型上定义local
范围以重构查询。这里有几个:
class Ticket extends Model
{
use SoftDeletes;
public function scopeByAuthUser($query)
{
return $query->where('user_id','=', \Auth::user()->id);
}
public function scopeOpen($query)
{
return $query->where('status_id', 1);
}
public function scopePending($query)
{
return $query->where('status_id', 2);
}
public function scopeClose($query)
{
return $query->where('status_id', 2);
}
}
以下是重构条件的方法:
// for the first query
$tickets = Ticket::with('users','ticketStatus','ticketType','tbl_contacts')
->byAuthUser()
->latest();
if(request('Open') || request('Pending') || request('Close')) {
$scope = strtolower(request('Open') ?? request('Pending') ?? request('Close'));
$tickets = $tickets->{$scope}()->get();
} else {
$tickets = $tickets->get();
}
推荐阅读
- wordpress - VC Image Carousel not mobile responsive
- android - Branch.io does not work with multidex because of manifest conflict
- python - Python最大成对产品时间限制超出错误
- android - 当标记向目的地移动时减少谷歌地图中的折线(Android)
- javascript - How to make horizontal margin between images constant in mosaic
- appium - 在 Windows 上自动化 IOS 设备的推荐方法是什么?
- python - 在 Python 列表中访问字典
- lotus-notes - 在 Notes 客户端中以编程方式过滤 Notes View UI
- symfony - 如何在 OroCRM 中使用表单处理程序?
- html - 如何在cshtml中使用转义引号