Laravel - Как отфильтровать по выпадающему меню в DB Raw - PullRequest
0 голосов
/ 05 июля 2019

У меня есть этот класс модели:

class Billings extends Model
{
protected $table = 'billings';

protected $fillable = [
    'msisdn',
    'created_at',
    'amount',
    'billing_channel',   
];


protected $guarded = [
    'id'
];
}

Контроллер

    public function billingsReport(Request $request)
{        
    $billings = DB::table('billings')
    ->select(
       'msisdn', 
         DB::raw('created_at as created_date'),
       'amount',
       'billing_channel'
  )               
 ->orderByRaw('created_at DESC');         

    $render=[];       
    if(isset($request->msisdn))
    {
        $billings=$billings->where('msisdn','like','%'.$request->msisdn.'%');
        $render['msisdn']=$request->msisdn;
    }   
    if(isset($request->billing_channel))
    {
        $billings=$billings->where('billing_channel','like','%'.$request->billing_channel.'%');
        $render['billing_channel']=$request->billing_channel;
    }               
    $billings= $billings->orderBy('created_at','DESC');
    $billings= $billings->paginate(15);
    $billings= $billings->appends($render);
    $data['billings'] = $billings;

return view('report.billingsReport',$data);        
}

Обратите внимание, что поле billing_channel находится в таблице счетов

Вид

    <div class="row" style="margin-bottom: 10px">
    {{ Form::model(request(),['method'=>'get']) }}
    <div class="col-sm-2">
         {{ Form::text('msisdn',null,['class'=>'form-control','placeholder'=>'MSISDN']) }}
    </div>         
    <div class="col-xs-2">
        {{ Form::submit('Search',['class'=>'btn btn-warning']) }}
    </div>
    {{ Form::close() }}
</div>

Уже работает текстовый фильтр для msisdn.

Из моего контроллера и представления я фильтрую msisdn, а также использую form :: text в представлении.Вопрос в том, как мне также отфильтровать billing_channel, используя form :: select

Как мне изменить мою модель, представление и контроллер для этого?

Ответы [ 2 ]

0 голосов
/ 05 июля 2019

Получите итеративный набор billingChannels и передайте их представлению.

Затем вы можете добавить что-то подобное в форму:

<select name="billing_channel">
@foreach($billingChannel as $billingChannel)
    <option value={{ $billingChannel->value }}>{{ $billingChannel->name }}</option>
@endforeach
</select>

У вас, похоже, уже есть код вваш контроллер, так что это должно быть все, что вам нужно.

Если вы хотите использовать фасад Form от Laravel Collective, взгляните на их документацию , чтобы понять, какиспользовать его.

0 голосов
/ 05 июля 2019

Ваша модель верна, но для контроллера я рекомендую вам использовать модель для получения данных, а также для внешнего интерфейса, который вы можете использовать select2 https://select2.github.io/select2/, чтобы показать, и его заполнение поможет вам отфильтровать его из выбора довольно прост в использовании, для контроллера вы можете использовать что-то вроде:

public function billingsReport(Request $request)
{
        $msisdn = $request->msisdn;

        $billings = Billings::select('msisdn', 'created_at as created_date', 'amount', 'billing_channel')
            ->orderBy('created_at', 'DESC')
            ->when(isset($request->msisdn), function($query) use ($msisdn) {
                $query->where('msisdn','like','%'.$msisdn.'%');
            })
            ->paginate(15);


        return view('report.billingsReport', compact('billings'));        
}

и для используемого вами вида:

<select class="form-control" id="yourid">
@foreach($billings as $billing)
<option value="{{ your key }}">{{ the filed that you want to display }}</option>
@endforeach
</select>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...