Rumah  >  Soal Jawab  >  teks badan

Cari siaran mengikut tag

Saya perlu memaparkan siaran mengikut tag. Penyelesaian saya berfungsi untuk satu label seperti ini:

Laluan:

Route::get('/posts',
   [PostController::class, 'index'])->middleware('auth');

Penapis Model Pos:

public function scopeFilter($query, array $filters)
{
    if ($filters['tag'] ?? false) {
        $tagId = Tag::where('name', $filters['tag'])->first()->id;
        $query->whereHas('tags', function($q) use ($tagId) {
                $q->where('tag_id', $tagId);
        });
    }
}

Indeks kaedah PostController:

public function index()
{
    return view('posts', [
        'posts' => Post::latest()->filter(request(['tag']))->get()
    ]);
}

Kod ini digunakan pada URL berikut: "http://127.0.0.1:8000/posts/?tag=test". Tetapi saya perlu mencari cara untuk mencari siaran dengan lebih banyak tag, contohnya saya ingin mencari siaran dengan tag "ujian" dan "unit". Untuk melakukan ini saya ingin menggunakan URL seperti ini: "http://127.0.0.1:8000/posts/?tag=test&unit". Saya tersekat kerana saya fikir "permintaan(['tag'])" akan mengembalikan "ujian&unit" tetapi ia hanya mengembalikan "ujian". Adakah mungkin untuk mendapatkan teg "unit" daripada permintaan ini?

P粉323050780P粉323050780179 hari yang lalu443

membalas semua(1)saya akan balas

  • P粉596161915

    P粉5961619152024-04-04 18:26:32

    Gunakan rentetan pertanyaan ( GET 请求可以接受多个参数。而不是 ?tag=test&unit (无论如何都不会真正起作用,因为 &unit 将被解析为 $request->input('unit'),并且将是 null& ialah aksara terpelihara), anda boleh menghantarnya sebagai:

    http://127.0.0.1:8000/posts?tags[]=test&tags[]=unit

    Di bahagian belakang, apabila anda mengakses request()->input('tags') anda mendapat tatasusunan berikut:

    $tags = request()->input('tags'); // ['test', 'unit']
    

    Jadi, menggabungkannya:

    // ScopeFilter method on your `Post` Model
    public function scopeFilter($query, array $tagNames) {
      if (!empty($tagNames)) {
        $tagIds = Tag::whereIn('name', $tagNames)->pluck('id');
    
        return $query->whereHas('tags', function($subQuery) use ($tagIds) {
          return $subQuery->whereIn('tags.id', $tagIds);
        });
    
        // Alternative without `$tagIds`, using `$tagNames` directly
        // return $query->whereHas('tags', function($subQuery) use ($tagNames) {
        //   return $subQuery->whereIn('tags.name', $tagNames);
        // });
      }
    
      return $query;
    }
    
    // Usage
    public function index() {
      return view('posts', [
        'posts' => Post::latest()->filter(request()->input('tags', []))->get()
      ]);
    }
    
    • Laraskan pertanyaan untuk mengendalikan berbilang nilai menggunakan whereIn()
    • Menggunakan request()->input('tags', []) 访问 ?tags[]=...&tags[]=..., atau tatasusunan kosong jika tidak disediakan.

    balas
    0
  • Batalbalas