簡體   English   中英

如何基於網絡中的單個字段進行多次搜索

[英]How can I do a multiple search based on single fields in my web

我正在使用Laravel建立一個網站,並且想要創建一個類似於表單的搜索,用戶可以使用不同的流派搜索電影。 問題是,當我嘗試使用一種以上的流派時,它僅顯示為我的每個字段選擇的最后一個選項。 例如,我的搜索選項是流派和年份,我嘗試輸入喜劇,愛情,動作,1992、2005,但僅在2005年輸出動作電影。

所有數據都存儲在MySQL數據庫中,我使用了基本的復選框來進行輸入,數據出現在URL中並進行搜索,但僅適用於每個字段中的一個選項。

<form action="/home" method="GET">
    <hr>
    <h4>Genre</h4><br>
    @foreach($movies as $movie)
        <input type="checkbox" name="genre" value="{{$movie->genre}}">{{$movie->genre}}<br>
    @endforeach
    <hr>
    <h4>Year</h4>
    @foreach($movies as $movie)
        <input type="checkbox" name="year" value="{{$movie->year}}">{{$movie->year}}<br>
    @endforeach
    <input type="submit" class="btn btn-success" value="Search"><br>
</form>

這個想法是,如果用戶輸入喜劇,浪漫,動作1992、2005,則輸出將顯示1992和2005的喜劇電影,動作電影和浪漫電影。

編輯

這是我的控制器,在其中進行搜索和分頁。

public function index(Request $request)
{
$movies = \DB::table('movies');

$queries = [];

$columns = [
  'genre','year'
];

foreach ($columns as $column) {
    if (request()->has($column)) {
        $movies = $movies->where($column, request($column));
        $queries[$column] = request($column);
    }
}
$movies = $movies->orderBy('created_at', 'desc')->paginate(20)->appends($queries);
return view('home', compact('movies'));
}

如果允許用戶選擇多個genreyear值,則您的輸入必須是數組。 更改name屬性以使用[]

@foreach($movies as $movie)
<input type="checkbox" name="genre[]" value="{{ $movie->genre }}">{{ $movie->genre }}<br/>
@endforeach
...
@foreach($movies as $movie)
<input type="checkbox" name="year[]" value="{{ $movie->year }}">{{ $movie->year }}<br/>
@endforeach

由於您省略了[] ,因此只有最后一個具有相同name復選框被發送到服務器。 這樣,在后端,您的值應該是數組:

$selectedGenres = $request->input("genre");
// ["comedy", "romance", ...];

$selectedYears = $request->input("year");
// ["1990", "2019", ...];

然后,您可以在簡單的查詢中使用它:

$foundMovies = Movie::whereIn("genre", $selectedGenres)
->whereIn("year", $selectedYears)
->get();

如果未選擇genreyear值,您可能不得不忽略搜索,但是可以通過驗證來完成:

"genre" => "required|array|min:1",
"year" => "required|array|min:1"

或支票:

if(count($selectedGenres) != 0){ ... }

由於您的循環會生成復選框,因此您的“名稱”屬性必須是一個數組:

@foreach($movies as $movie)
<input type="checkbox" name="genre[]" value="{{ $movie->genre }}">{{ $movie->genre }}<br/>
@endforeach

您還應該將驗證規則添加到formRequest,僅用於檢查接收到的值是否存在以及是否為數組。

"genre" => "required|array",
"year" => "required|array"

最后,您的查詢將如下所示:

$genres = $request->genre;
$years = $request->year;

Movie::when(count($genres) > 0,function ($query, $genres) {
                    return $query->whereIn('genre', $genres);
     })
     ->when(count($years) > 0,function ($query, $years) {
                    return $query->whereIn('year', $years);
     })
     ->get();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM