2017-03-17 36 views
5

Chciałbym użyć konstruktora zapytań z operatorem LIKE, ale nie działa poprawnie.Laravel, gdzie jak nie działa poprawnie

Oto mój kod w moim kontrolera:

public function listall($query) { 
     $Clubs = Club::where('clubs.name', 'like', "%$query%") 
       ->Join('leagues', 'clubs.league_id', '=', 'leagues.id') 
       ->select('clubs.id', 'clubs.name', 'clubs.blason', 'leagues.name as league_name') 
       ->orderBy('clubs.name') 
       ->get(); 

     return Response::json($Clubs); 
    } 

Tu jest mój kod JavaScript:

<script type="text/javascript"> 
    function hasard(min,max){ 
     return min+Math.floor(Math.random()*(max-min+1)); 
    } 
    jQuery(document).ready(function($) { 
     // Set the Options for "Bloodhound" suggestion engine 
     var engine = new Bloodhound({ 
      remote: { 
       url: "{{ url('club/listall') }}"+'/%QUERY%', 
       wildcard: '%QUERY%' 
      }, 
      datumTokenizer: Bloodhound.tokenizers.obj.whitespace, 
      queryTokenizer: Bloodhound.tokenizers.whitespace 
     }); 

     $(".club-search").typeahead({ 
      hint: true, 
      highlight: true, 
      minLength: 1 
     }, { 
      source: engine.ttAdapter(), 
      display: "name", 
      // This will be appended to "tt-dataset-" to form the class name of the suggestion menu. 
      name: 'clubsList', 

      // the key from the array we want to display (name,id,email,etc...) 
      templates: { 
       empty: [ 
        '<div class="list-group search-results-dropdown"><div class="list-group-item">Aucun club trouvé.</div></div>' 
       ], 
       header: [ 
        '<div class="list-group search-results-dropdown">' 
       ], 
       suggestion: function (data) { 
        if (data.blason == null) { 
         var aleat = hasard(1,4); 
         if (aleat == 1) { 
          var blason = "/images/blasons/blason-bleu.svg"; 
         } else if (aleat == 2) { 
          var blason = "/images/blasons/blason-orange.svg"; 
         } else if (aleat == 3) { 
          var blason = "/images/blasons/blason-rouge.svg"; 
         } else if (aleat == 4) { 
          var blason = "/images/blasons/blason-vert.svg"; 
         } 
        } 
        else { 
         var blason = "/images/blasons/" + data.blason; 
        } 
        return '<a href="{{ url('club') }}' + '/' + data.id + '" class="list-group-item"><span class="row">' + 
           '<span class="avatar">' + 
            '<img src="{{asset('/')}}' + blason + '">' + 
           "</span>" + 
           '<span class="name">' + data.name + '<br><small style="color:grey;">(Ligue ' + data.league_name + ')</small></span>' + 
          "</span>" 
      } 
      } 
     }); 
    }); 
</script> 

Ale jej nie działa całkowicie prawidłowo ... W ogóle, to znajdzie wyniki, ale Poda przykład wyszukiwania. Jednym z możliwych zapytań jest "montagnarde". Dam ci wynik za każdy list. Wpisanie:

m --> lot of results 
mo --> lot of results 
mon --> lot of results 
mont --> lot of results 
monta --> lot of results 
montag --> lot of results 
montagn --> lot of results 
montagna --> no result 
montagnar --> finds only "J.S. MONTAGNARDE" 
montagnard --> finds only "J.S. MONTAGNARDE" 
montagnarde --> finds only "J.S. MONTAGNARDE" and "LA MONTAGNARDE" 
montagnarde i --> finds only "U.S. MONTAGNARDE INZINZAC" 

Czy ktoś widzi, gdzie jest problem? Z góry dziękuję!

+0

Zamiast '-> get()' w na końcu zapytania użyj '-> toSql()', a następnie wydrukuj lub 'dd()' wynik. Spowoduje to wyświetlenie zapytania, które faktycznie jest uruchamiane - przydatne debugowanie, tak jak teraz. – James

+0

Wygląda na to, że działa poprawnie. Jaki jest wynik, który spodziewasz się zobaczyć? –

+0

Oto wynik: "wybierz' trefle''id', 'trefl''name',' trefle''blason', 'lig''name' jako' nazwa_licencji' od 'trefl' join wewnętrzny 'ligi' na' trefl''league_id' = 'ligi''id' gdzie' trefl''namename 'like 'club''name' asc" –

Odpowiedz

0

Myślę, że twoja konkatenacja ciągów jest błędna.

Spróbuj zmienić WHERE do

where('clubs.name', 'LIKE', '%' . $query. '%') 
+0

Dziękuję za odpowiedź, ale to jest taki sam wynik z: gdzie ('clubs.name', 'LIKE', '%'. $ query. '%') lub gdzie ('clubs.name', 'LIKE', "% $ query%") –

+0

Nie ma nic złego w korzystaniu z '"% $ query% "'. PHP interpoluje zmienne w łańcuchach podwójnie cytowanych. – Jonathon

0

@Dealeo Można napisać to. Mam nadzieję, że to rozwiąże problem

public function listall($query) { 
     $Clubs = Club::Join('leagues', 'clubs.league_id', 'leagues.id') 
       ->where('clubs.name', 'LIKE', '%' . $query . '%') 
       ->select('clubs.id', 'clubs.name', 'clubs.blason', 'leagues.name as league_name') 
       ->orderBy('clubs.name') 
       ->get(); 

     return Response::json($Clubs); 
    } 
+0

Dziękuję za odpowiedź, ale mam te same wyniki z kodem. –

+0

@ Dealeo-JeromeMansbendel Zaktualizowałem moją odpowiedź. Spróbowałbyś tego? –

0

Sprawdź teraz:

public function listall ($ query) {

dd($query); 

$clubs = Club::join('leagues', 'clubs.league_id', '=', 'leagues.id') 
->where('clubs.name', 'LIKE', '%' . $query . '%') 
->select('clubs.id', 'clubs.name', 'clubs.blason', 'leagues.name as league_name') 
->orderBy('clubs.name'); 

dd($clubs->toSql()); 

return Response::json($clubs); 

}

0

może trzeba korzystać z wyszukiwarki zapytanie jak to:

->where('clubs.name', 'like', "%{$query}%") 
0

Proponuję, aby dodać COLLATE UTF8_GENERAL_CI do definicji tabeli, a następnie spróbuj zapytanie następująco (z leftJoin):

public function listall($query) { 
     $Clubs = Club::leftJoin('leagues', 'clubs.league_id', '=', 'leagues.id') 
       ->where('clubs.name', 'like', "%$query%") 
       ->select('clubs.id', 'clubs.name', 'clubs.blason', 'leagues.name as league_name') 
       ->orderBy('clubs.name') 
       ->get(); 

     return Response::json($Clubs); 
    } 

sortowania utf8 sugestia od: How can I search (case-insensitive) in a column using LIKE wildcard?