【问题标题】:Laravel 6 query related to searching events not showing result when some fields are empty and some not与搜索事件相关的 Laravel 6 查询在某些字段为空而某些字段不为空时不显示结果
【发布时间】:2021-06-01 22:44:34
【问题描述】:

我是第一次开发 laravel 的新手。 我的目标是显示一些过滤后的事件,过滤器应该一起工作('filter 1' AND 'filter2' ecc..),即使有些是空的。 我遇到的问题是,当我的过滤器字段为空时,查询不会返回任何事件。 我的控制器代码:

<?php

namespace App\Http\Controllers;
use App\Event;
use Illuminate\Http\Request;

use Illuminate\Support\Facades\DB;
use Mockery\Matcher\Not;
use phpDocumentor\Reflection\Types\Nullable;
use Symfony\Component\HttpFoundation\Response;
use App\RequestController;

class EventsController extends Controller
{

    public function index(){
        $eventi= Event::paginate(4);
        return view('CatalogoEventi',compact('eventi'));
    }

    public function mostraSingoloEvento($id){
        $singoloevento=Event::findOrFail($id);
        return view('PagineDinamiche/InformazioniEvento',['singoloevento'=>$singoloevento]);
    }

    public function searchEvent(){

        $data = request('data');
        $regione = request('regione');
        $societa = request('società');
        $desc = request('descrizione');

        /*
                $eventi = DB::table('users');
                if($desc!=null)
                    $eventi = $eventi->where('anteprima',$desc);
                 if($data!=null)
                     $eventi = $eventi->where('data',$data);
                if($regione!=null)
                    $eventi = $eventi->where('regione',$regione);
                if($societa!=null)
                    $eventi = $eventi->where('società',$societa);

                return view('CatalogoEventi', ['eventi'=>$eventi]); */

                 $eventi = DB::table('events')

                     ->where('anteprima','=',$desc)
                     ->where('data', '=' , $data)
                     ->where('regione', '=' , $regione)
                     ->paginate(4);

                   /* ->where('società', '=' , $societa)  */

                return view('CatalogoEventi',['eventi'=>$eventi]);


    }

    /*
    public function createEvent(){
        return redirect('/CatalogoEventi');
    }
    */

}

更详细


public function searchEvent(){

        $data = request('data');
        $regione = request('regione');
        $societa = request('società');
        $desc = request('descrizione');
         $eventi = DB::table('events')

                     ->where('anteprima','=',$desc)
                     ->where('data', '=' , $data)
                     ->where('regione', '=' , $regione)
                     ->paginate(4);

                return view('CatalogoEventi',['eventi'=>$eventi]);
    }

我的观点 CatalogoEventi:

@extends('layouts.Public')

@section('title', 'Catalogo Eventi')


<!-- CatalogoEventi -->
@section('content')
    <!-- RICERCA START  -->

<style>
    label{
        color: white;
        font-size: 25px;
        background-image:image('/public/css/images/promo/p1.jpg') ;
        max-width: 250px;
    }
    input{
        padding: 10px;
        font-size: 15px;
        max-width: 300px;
    }
    select{
        padding: 10px;
    }
</style>
    <div class="events parallax-one pad" id="events">
        <div class="container">
            <!-- default heading -->
            <div class="default-heading-shadow">
                <!-- heading -->
                <h2>Catalogo Eventi</h2>
            </div>
            <!-- events element -->
            <div class="events-element">
                <!-- BARRA DI RICERCA -->
                <!-- RICERCA -->
                <div class="container">
                    <!-- Collect the nav links, forms, and other content for toggling -->
                    <form name="Ricerca" action="/grp_15f/public/CatalogoEventi/ricerca" method="POST">
                        @csrf
                        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">

                        <label for="descrizione" class="col-md-4 col-form-label text-md-right">{{ __('Descrizione ') }}</label>
                        <input type="text" name="descrizione" id="Descrizione" placeholder="Descrizione">
                    <br><br>
                        <label for="Data" class="col-md-4 col-form-label text-md-right">{{ __('Data ') }}</label>
                        <input type="date" name="data" id="Data" placeholder="Mese ed Anno(MM/AAAA)">
                    <br><br>

                        <label for="Regione" class="col-md-4 col-form-label text-md-right">{{ __('Regione') }}</label>
                        <input type="text" name="regione" id="Regione" placeholder="Regione">
                    <br><br>

                        <label for="Società" class="col-md-4 col-form-label text-md-right">{{ __('Società') }}</label>
                    <select name="società">
                        <option value="NEXT EVENTI">NEXT EVENTI</option>
                        <option value="Pincopallino srl">Pincopallino srl</option>
                        <option value="Steposkrt spa">Steposkrt spa</option>

                    </select>
                        <!-- FUNZIONE RICERCA DA IMPLEMENTARE -->
                         <input type="submit" name="tasto_cerca" value="Cerca">

                    </div>
                    </form>
                    <!-- /.navbar-collapse -->
                </div><!-- /.container-fluid -->

                <!--/ RICERCA END -->

    <!-- CATALOGO EVENTI -->
            <div class="row">

                @foreach ($eventi as $event)
                    <div class="col-md-6 col-sm-6">
                        <!-- event item -->
                        <div class="events-item">
                            <!-- image container -->
                            <div class="figure">
                                <!-- event date -->
                                <div class="event-date">
                                    <!--  DA MODIFICARE -->
                                    <span class="emonth">Data: {{ $event->data }}</span>
                                    <div class="clearfix"></div>
                                </div>
                                <!-- event location -->
                                <span class="event-location"><i class="fa fa-map-marker"></i> Luogo:{{ $event->luogo }} </span>
                                <!-- image -->
                            @include('PagineDinamiche/eventImage', ['attrs' => 'imagefrm', 'imgFile' => $event->immagine])
                                <!-- image hover -->
                                <div class="img-hover">
                                    <!-- hover icon -->
                                    <a href="{{ route('infoEvento',['id'=>$event->id])  }}"><i class="fa fa-play-circle"></i></a>
                                </div>
                            </div>
                            <!-- event information -->
                            <div class="event-info">
                                <!-- event title -->
                                <h3>Titolo: {{ $event->nome }}</h3>
                                <!-- horizontal line --><hr />
                                <!-- paragraph -->
                                <p> Descrizione Breve: {!! $event->anteprima !!} </p>
                                <a href="{{  route('infoEvento',['id'=>$event->id]) }}">Scopri di piu..</a>
                            </div>
                        </div>
                    </div>
                @endforeach
                </div>
            </div>

        </div>
        <!--Paginazione-->
        @include('pagination.paginator', ['paginator' => $eventi])
    </div>

@endsection

我的路线

//CATALOGO EVENTI
Route::get('/CatalogoEventi','EventsController@index')
    ->name('catalogoEventi');

//ROTTA RICERCA
Route::any('/CatalogoEventi/ricerca','EventsController@searchEvent');

result from the query abovewith field 'regione' not empty and others empty

如果我只使用这个

$eventi = DB::table('events')

                 
                     ->where('regione', '=' , $regione)
                     ->paginate(4);

实际上我得到了一些结果,我可以显示它们(有些问题是指分页器,但这不是主要问题)。 我认为我应该修复查询(我想这样做)以完成所有工作但现在我不知道。

【问题讨论】:

  • 您可以使用when 添加conditional clauses 例如-&gt;when($desc, function ($q, $desc) { $q-&gt;where('anteprima','=',$desc); })
  • @Steposkrt 你的注释代码很好。只是做了一些改进。而不是 if($desc!=null) 使用 if(isset($desc)) 在你的情况下,这些可行的可能不是空的,而是空字符串。 而不是if($desc!=null) 使用if(request()-&gt;filled('descrizione'))

标签: php laravel eloquent


【解决方案1】:

您最初的问题可能是输入值不是空值,而是空字符串。

但是像这样的条件查询很好地使用了when() 查询构建器方法。如果第一个参数的计算结果为非假值,则执行第二个参数。

public function searchEvent(Request $request)
{
    $eventi = DB::table("users")
        ->when($request->descrizione, fn($q, $v) => $q->where("anteprima", $v))
        ->when($request->data, fn($q, $v) => $q->where("data", $v))
        ->when($request->regione, fn($q, $v) => $q->where("regione", $v))
            // you should rename this input to ascii just to be safe
        ->when($request->societa, fn($q, $v) => $q->where("societa", $v))
        ->paginate(4);

    return view("CatalogoEventi", compact("eventi"));
}

或者,如果你还在使用没有箭头函数的旧 PHP:

public function searchEvent(Request $request)
{
    $eventi = DB::table("users")
        ->when($request->descrizione, function ($q, $v) {
            return $q->where("anteprima", $v);
        })
        ->when($request->data, function ($q, $v) {
            return $q->where("data", $v);
        })
        ->when($request->regione, function ($q, $v) {
            return $q->where("regione", $v);
        })
            // you should rename this input to ascii just to be safe
        ->when($request->societa, function ($q, $v) {
            return $q->where("societa", $v);
        })
        ->paginate(4);

    return view("CatalogoEventi", compact("eventi"));
}

【讨论】:

    【解决方案2】:

    公共函数 searchEvent(){

        $data = request('data');
        $regione = request('regione');
        $societa = request('società');
        $desc = request('descrizione');
         $eventi = DB::table('events')
    
                     ->where('anteprima','=',$desc)
                     ->orWhere('data', '=' , $data)
                     ->orWhere('regione', '=' , $regione)
                     ->paginate(4);
    
                return view('CatalogoEventi',['eventi'=>$eventi]);
    }
    

    【讨论】:

      【解决方案3】:
      $eventi = DB::table('events')
                  ->when($desc, function ($q, $desc) {
                       $q->where('anteprima', 'like', '%' . request('descrizione') . '%' );
                  })
      

      最后一件事我更新了“描述”的查询部分,因为它正在比较字符串。但实际上我希望每当我输入一个包含在 anteprima 列中的单词时,都会显示结果。 就像 anteprima='some stuff and more stuff' 一样,我在“Descrizione”标签中输入“更多”这个词,我应该得到的结果将是包含“更多”的记录。 上面的代码可以按我的预期工作。 非常感谢您的支持,并为我糟糕的英语句子感到抱歉。 :)

      【讨论】:

        猜你喜欢
        • 2018-04-09
        • 2010-12-15
        • 1970-01-01
        • 2012-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-01
        • 2018-02-24
        相关资源
        最近更新 更多