Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

Laravel/php/sql search bar sorunu


xcorp

Öne çıkan mesajlar

öncelikle selamlar,
yapmaya çalıştığım girilen kelimelerin bütün varyasyonlarını db de aratmak.
örneğin "1 2 3" girildiğinde;
"1 2 3", "1 2" , "1 3", "2 3" , "1", "2" , "3" hepsini aratmak istiyorum. internetten bulduklarımla bir şeyler yaptım ama emin olamadım, bu sefer de acaba sql açığı olur mu diye korktum.

girilen kelime kombinasyonlarını bulmak için;

$keywords = ['baba', 'beni', 'okula', 'gonder' , ''];
$GLOBALS['a'] = [];
function combine($word, $arr){
if ($word !== "" && count($arr) === 0){
return;
}
if($word !== ""){
array_push($GLOBALS['a'] , $word);
}
if(count($arr) > 0){
$n_word = $arr[0];
array_shift($arr);
if($word !== "" && $n_word !== ""){$n_word = " " . $n_word;}
combine($word.$n_word, $arr );
combine($word, $arr);
}
}
combine("", $keywords);
dd(array_unique($GLOBALS['a']));


local veri beceremeyince global denedim. ama birden fazla aynı sonucu verdi. array_unique() ile istenilen sonuca ulaştım ama içim rahat etmedi.

db deki tabloları birleştirip hepsinde aratmaya çalışıyorum.
alttaki kod çalışıyor ama doğru mudur emin olamadım.

IlluminateDatabaseQueryBuilder::macro('searchValues', function ($columnName, $keys) {
$que;
foreach($keys as $index=>$key){
if($index == 0) {
$que = $this->where($columnName, 'LIKE', '%'.$key.'%');
}else {
$que = $que->orWhere($columnName, 'LIKE', '%'.$key.'%');
}
}
return $que;
});


bir de union yaptığım tablolardan birinden isim birinden title çekiyorum. kullanım yanlıs mı ona emin olamadım. hep aynı sütundan veri çekilen örnekleri bulabildim.


$result_p = post::select("id","title", DB::raw("NULL as name"),"picture","slug" ,DB::raw("'post' as source"))->searchValues('title' , $generated);

$result_t = tag::select("id",DB::raw("NULL as title"), "name",DB::raw("NULL as picture"),"slug",DB::raw("'tag' as source"))->searchValues('name' , $generated);

$result = $result_p->union($result_t)->get();


bu da iyi güzel hoş da zurnanın zırt dediği yer şu ki en üstteki kodun çıktısı:

0 => "baba"
1 => "baba beni"
2 => "baba beni okula"
3 => "baba beni okula gonder"
6 => "baba beni gonder"
9 => "baba okula"
10 => "baba okula gonder"
13 => "baba gonder"
15 => "beni"
16 => "beni okula"
17 => "beni okula gonder"
20 => "beni gonder"
22 => "okula"
23 => "okula gonder"
25 => "gonder"


şeklinde oldugundan aranılan kelimelere ait tam bir veri varsa 0, 1 ve 2 den sonra geliyor.
combine fonksiyonunun en cok kelime içeren veriyi 0 a, sonrasında da sırasıyla azala azala eklemesini isterdim aranacak verileri. asıl sormak istediğim yer de tam burası. var mıdır yardımcı olacak birileri ):
Link to comment
Sosyal ağlarda paylaş

×
×
  • Yeni Oluştur...