【问题标题】:Laravel where like not working properlyLaravel 不能正常工作的地方
【发布时间】:2017-08-09 12:39:24
【问题描述】:

我想使用带有 LIKE 运算符的查询生成器,但它不能正常工作。

这是我的控制器中的代码:

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"

有人知道问题出在哪里吗? 提前谢谢!

【问题讨论】:

  • 不要在查询末尾使用-&gt;get(),而是使用-&gt;toSql(),然后打印或dd() 结果。这将向您显示实际正在运行的查询 - 像您现在正在做的有用的调试。
  • 这里是结果:“选择clubs.id, clubs.name, clubs.blason, leagues.@9876543334@ as @987654从clubs 内部连接leagues on clubs.league_id = leagues.id where clubs.name like ? order by clubs.namec> as

标签: javascript mysql laravel sql-like query-builder


【解决方案1】:

我认为你的字符串连接是错误的。

尝试将where语句改为

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

【讨论】:

  • 感谢您的回答,但这与以下结果相同: where('clubs.name', 'LIKE', '%' . $query.'%') 或 where('clubs .name', 'LIKE', "%$query%")
  • 使用"%$query%"没有任何问题。 PHP 在双引号字符串中插入变量。
【解决方案2】:

试试这个

$Clubs = Club::where(DB::raw('LOWER(clubs.name)'), 'LIKE', '%'.strtolower($query).'%')
->Join('leagues', 'clubs.league_id', '=', 'leagues.id')
->select('clubs.id', 'clubs.name', 'clubs.blason', 'leagues.name as league_name')
->orderBy('clubs.name')
->get();

【讨论】:

    【解决方案3】:

    立即检查:

    公共函数 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);
    

    }

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 感谢您的回答,但我的代码结果相同。
      • @Dealeo-JeromeMansbendel 我已经更新了我的答案。你会试试这个吗?
      【解决方案5】:

      您可能必须像这样使用搜索查询:

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

      【讨论】:

        【解决方案6】:

        我建议您将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);
            }
        

        整理来自How can I search (case-insensitive) in a column using LIKE wildcard?的utf8建议

        【讨论】:

          【解决方案7】:

          类似 MySQL 的语句和“%xyz spaces-bla-bla 123%”不起作用。 这不是 Laravel 的问题。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-09-29
            • 2015-06-29
            • 2016-08-01
            • 2012-11-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-12-21
            相关资源
            最近更新 更多