2017-03-17 148 views
5

我想使用LIKE操作符的查詢生成器,但它不能正常工作。Laravel喜歡不能正常工作

這是我在我的控制器代碼:

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); 
    } 

這裏是我的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> 

但它不是完全正常工作......在一般情況下,它發現的結果,但我會給你一個搜索查詢的例子。一個可能的查詢是「montagnarde」。我會給你每封信的結果。打字:

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" 

有人看到問題在哪裏嗎? 提前謝謝!

+0

而不是使用' - >獲得()'在查詢結束時,使用' - > toSql()',然後打印或者輸出dd()結果。這將向您顯示實際正在運行的查詢 - 像您現在正在執行的有用的調試。 – James

+0

它看起來像是正常工作。你期望看到什麼結果? –

+0

結果如下: 「select'clubs'.'id','clubs'.'name','clubs'.'blason','leagues'.'name' as'league_name' from'clubs' inner join 'leagues' on'clubs'.'league_id' ='leagues'.'id' where'clubs'.'name' like?order by'clubs'.'name' asc「 –

回答

0

我想你的字符串連接是錯誤的。

嘗試WHERE語句改爲

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

Thank you for your answer,but This is ('clubs.name','LIKE','%'。$ query。'%')或 where('clubs.name','LIKE',「%$ query%」)的結果相同: –

+0

使用'「%$ query%」''沒有什麼錯誤。 PHP用雙引號字符串插入變量。 – Jonathon

0

@Dealeo你可以這樣寫。希望這將解決您的問題,現在

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

謝謝您的回答,但我的代碼與結果相同。 –

+0

@ Dealeo-JeromeMansbendel我已經更新了我的答案。你會嘗試這個嗎? –

0

檢查:

公共職能listall($查詢){

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

您可能需要使用搜索查詢類似這個:

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

我建議你COLLATE UTF8_GENERAL_CI添加到您的表定義,然後嘗試查詢像這樣(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); 
    } 

分頁utf8的建議來自:How can I search (case-insensitive) in a column using LIKE wildcard?