Bagaimana untuk melaksanakan fungsi carian dalam Laravel yang mengutamakan perkaitan apabila mencari merentas berbilang lajur dengan berbilang kata kunci?

Patricia Arquette
Lepaskan: 2024-11-05 16:00:03
asal
1038 orang telah melayarinya

How to implement a search function in Laravel that prioritizes relevance when searching across multiple columns with multiple keywords?

Laravel: Carian Menggunakan Berbilang Kata Kunci Merentas Berbilang Lajur dengan Keputusan Tertib Berkaitan

Dalam Laravel, melaksanakan fungsi carian yang mencari data berdasarkan berbilang kata kunci dalam berbilang lajur boleh mencabar, terutamanya apabila tertib perkaitan terlibat. Panduan komprehensif ini menangani masalah ini secara terperinci, menyediakan penyelesaian yang mengikut pendekatan berstruktur.

Struktur Pangkalan Data

Jadual pangkalan data melibatkan dua lajur: meta_name dan meta_description, di mana kata kunci carian akan dipadankan.

Kriteria Carian

Carian mempunyai kriteria khusus, mengutamakan hasil berdasarkan kehadiran kata kunci dalam kedua-dua lajur. Baris yang mengandungi ketiga-tiga kata kunci mendapat keutamaan tertinggi, diikuti dengan baris dengan hanya dua kata kunci pertama dan terakhir, baris dengan hanya kata kunci pertama.

Penomboran

The hasil carian akan dimuatkan secara dinamik menggunakan penomboran, dengan hasil baharu akan dilampirkan apabila pengguna menatal ke bahagian bawah halaman.

Kod Sumber

Coretan kod berikut mendapatkan semula hasil carian dalam susunan yang dikehendaki:

<code class="php">$word1 = 'word1';
$word2 = 'word2';
$word3 = 'word3';

$all = DB::table('posts')
    ->where('meta_name', 'like', "%{$word1}%")
    ->where('meta_name', 'like', "%{$word2}%")
    ->where('meta_name', 'like', "%{$word3}%")
    ->orWhere(function($query) use ($word1, $word2, $word3) {
        $query->where('meta_description', 'like', "%{$word1}%")
              ->where('meta_description', 'like', "%{$word2}%")
              ->where('meta_description', 'like', "%{$word3}%");
    });

$twoWords = DB::table('posts')
    ->where('meta_name', 'like', "%{$word1}%")
    ->where('meta_name', 'like', "%{$word2}%")
    ->orWhere(function($query) use ($word1, $word2) {
        $query->where('meta_description', 'like', "%{$word1}%")
              ->where('meta_description', 'like', "%{$word2}%");
    })
    ->whereNotIn('id', $all->pluck('id'));

$oneWord = DB::table('posts')
    ->where('meta_name', 'like', "%{$word1}%")
    ->orWhere('meta_description', 'like', "%{$word1}%")
    ->whereNotIn('id', $all->pluck('id'))
    ->whereNotIn('id', $twoWords->pluck('id'));</code>
Salin selepas log masuk

Pertanyaan Akhir

Untuk menggabungkan hasil, kami menggunakan kaedah unionAll:

<code class="php">$posts = $all->unionAll($twoWords)->unionAll($oneWord)->get(); // check this first
# or
$posts = $all->unionAll($twoWords)->unionAll($oneWord)->skip($start)->take($this->rowperpage)->get();</code>
Salin selepas log masuk

Kod ini mengambil keputusan dalam susunan yang ditentukan, mengutamakan perkaitan. Kaedah skip() dan take() digunakan untuk penomboran, di mana $start mewakili bilangan hasil yang telah dipaparkan. Akhir sekali, kaedah get() mendapatkan semula rekod.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan fungsi carian dalam Laravel yang mengutamakan perkaitan apabila mencari merentas berbilang lajur dengan berbilang kata kunci?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan