Filter dengan variable appends dari model Laravel

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() ?
image

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.

Jadi ini mau ngefilter attribute pinyin_converted yang hanya ada di collection nya ya ?

Return paginate() ada attribute data, mungkin bisa difilter lewat attribute data dan simpan ke variabel.

Contoh

$result = Dictionary::paginate();
$filteredData = $result->data->filter();


$result->data = $filteredData;
return $result;

Gak bisa mas, Undefined property $data. Yang benar pakai $data->getCollection()->filter untuk mengambil data dari output paginate()

hoo, kalo gini bisa ga ?

$result = Dictionary::paginate();
$filteredData = $result->getCollection()->filter();


$result->data = $filteredData;
return $result;

Iya bisa, tapi ya itu hanya 1 halaman (15 data) yang difilter, bukan semua halaman, ini yang jadi masalahnya saat ini. Sesuai yang ku jelaskan di pertanyaan.

Ini tricky, atau bahkan sulit dilakukan. Filtering + paginasi itu dilakukan di level query DB, sedangkan getPinyinConvertedAttribute ini tidak ada kolomnya di DB, jadi tidak bisa difilter.

Kalau datanyanya tidak banyak, bisa saja di getAll dulu dari DB, lalu paginasi + filtering dilakukan di level collection. Tapi kalau banyak, opsi ini tidak bisa dilakukan.

Untuk case seperti ini, biasanya pinyin_converted ini saya jadikan kolom baru. Proses pengisiannya bisa dilakukan secara otomatis dengan memanfaatkan Elqouent model event saving.

Solved, thank you atas sarannya, dicoba pakai cara ini bekerja sesuai ekspetasi.