首页 > 解决方案 > 这个雄辩的方法的查询范围?

问题描述

我在我的项目中创建了一个过滤器方法,我使用此方法过滤了数据,但现在我想在 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);
    //     }

    // }

}

标签: phplaravel

解决方案


您可以在模型上定义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();
 }

推荐阅读