xcorp Mesaj tarihi: Mart 11, 2018 Mesaj tarihi: Mart 11, 2018 ö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 ):
Lancelion Mesaj tarihi: Mart 11, 2018 Mesaj tarihi: Mart 11, 2018 sort by levensthein distance ? overkill olabilir biraz =p https://stackoverflow.com/questions/7217746/how-to-sort-an-array-by-similarity-in-relation-to-an-inputted-word
xcorp Mesaj tarihi: Mart 11, 2018 Konuyu açan Mesaj tarihi: Mart 11, 2018 cok teşekkür ederim. levenshteini bu amaçla nasıl kullanacagımı çözemedim. sanırım usortla tekrar dizicem. php cahili oldugumdan usortu kesfetmeme vesile oldu hiç yoktan :D
Lancelion Mesaj tarihi: Mart 11, 2018 Mesaj tarihi: Mart 11, 2018 ilk verdigin string'e 'benzemeye' gore sort etmek icin kullanabilirsin ama zaten php'de similar sort gibi bir sey varmis.
Öne çıkan mesajlar