Saat ini database menyimpan value Pinyin with numbers (pa1), ketika diload sudah diconvert menjadi Pinyin with tone marks (pā) dengan cara:
// Model
public function getPinyinConvertedAttribute()
{
return str_replace('[ ', '[', convertPinyinNumberToToneMark($this->pinyin));
}
// Helpers
use App\Pinyin\PinyinSentence; // https://github.com/chineseboost/php-pinyin
$valNotAllowed = ['[', ']'];
$clearedPinyinNumber = str_replace($valNotAllowed, '', $pinyinNumber);
$replaceSmallUmlaut = str_replace('u:', 'v', $clearedPinyinNumber);
$removeR5Space = str_replace(' r5', 'r', $replaceSmallUmlaut);
$finalWord = str_replace('U:', 'V', $removeR5Space);
$pinyin = new PinyinSentence($finalWord);
return $pinyin->toneMarked();
Kemudian data diambil dengan cara seperti ini:
$data = SomeModel::paginate();
Kasus:
Saat ini user ingin melakukan pencarian pada data yang disimpan, menggunakan kata kunci dari Pinyin tone mark (pā) tetapi yang disimpan di database adalah Pinyin number (pa1). Apabila query ditambah kondisi where dengan value Pinyin tone mark pasti tidak akan ketemu.
Ya benar, cara mudahnya adalah melakukan convert Pinyin Tone Mark ke Pinyin number, sayangnya sampai thread ini dibuat, saya belum menemukan lib / snippet code php / javascript yang bisa melakukan hal itu…
Jadi saya berinisiatif untuk memanfaatkan variable append pinyin_converted dari getPinyinConvertedAttribute() yang sudah diinisiasi pada model.
Pertanyaanya adalah:
Bagaimana cara melakukan filter menggunakan variable append yang di dapat dari pengambilan data menggunakan paginate() ?

Saya coba melakukan filter pakai cara ini, tapi hasilnya hanya halaman saat ini (yang dikunjungi user) yang difilter.
$filtered = $data->getCollection()->filter(function ($value) use ($isExact, $search) {
if ($isExact) {
return $value->pinyin_converted === $search;
} else {
return preg_match("/$search/", $value->pinyin_converted);
}
});
// getCollection hanya mengembalikan data halaman saat ini, tentu saja hanya data halaman saat ini
// yang dikembalikan, karena paginated itu tidak mengambil semua data, melainkan hanya mengambil
// beberapa data (default 15 data)
Kenapa pakai paginate? Pakai get() bisa mengambil semua data dan lakukan filter dari hasil get()
Datanya sangat banyak, apabila diambil semua loadingnya akan sangat lama.