2016-10-11 7 views
1

私はLaravelに新たなんだ、と私は、以下を実行しようとして捕まってしまいました。私は、次の列を持つシンプルなユーザーテーブルを持っている:Laravelの雄弁 - 複数の列の連結によってフィルタ

  • id
  • first_name
  • last_name

私はフィルタリングのオプションをユーザーのリストを作ることについてです。フィルタの1つがfull_nameですが、私はユーザのfull_nameを保存せず、テーブル構造を変更できません。

$query = \DB::table('users'); 
$query->select(\DB::raw('CONCAT_WS(" ", `last_name`, `first_name`) 
     as `full_name`, id'))->having('full_name', 'LIKE',$input['filter_name']); 
$result = $query->get(['*']); 

しかし、それは働いていない:私はこれになった数日以上

スペック:私は、最新のlaravelを使用しています。

+0

正確には機能しないものはありますか?間違いはありますか? laravelのクエリをデバッグする際にこれを読んでください:https://scotch.io/tutorials/debugging-queries-in-laravel – haakym

答えて

0

私はそれを解決しました。最初の問題は、 "%"ワイルドカードを忘れていたことです。

第二は、それがフィルタとして連結された値を使用し、次いでLaravelsのpaginateは、連結値を用いて、全体的な結果の数をカウントすることを試みました。確かにそれは存在しません。解決策は次のとおりです。

$query = \App\User::whereDeletedAt(null); 
$query->where(\DB::raw('CONCAT_WS(" ", `last_name`, `first_name`)'), 'like', '%' . $input['filter_name'] . '%'); 
$query->paginate(15, ['*'], 'page', 1); 
0

たぶん代わりのクエリをmodyfingことによってそれを達成しようとし、通常通りのようなクエリを取得: $users = DB::table('users')->get(); をそして、collectionsを使用しています。 ->filter(function($key, $value) { return strpos($value['first_name'].' '.$value['last_name'], $to_find) !== false })->all();

1

私はあなたがLIKE文でワイルドカードを忘れてしまったと思います。

代わりのこの

$query->select(\DB::raw('CONCAT_WS(" ", `last_name`, `first_name`) 
    as `full_name`, id'))->having('full_name', 'LIKE',$input['filter_name']); 

試してみてください。

$query->select(\DB::raw('CONCAT_WS(" ", `last_name`, `first_name`) 
    as `full_name`, id'))->having('full_name', 'LIKE', '%' . $input['filter_name'] . '%'); 
+0

うん。あまりにも遅くなった。私は '%'ワイルドカードを忘れてしまった... –

+0

ページネーム '$ query-> paginate(10、['*']、 'page'、1)'と一緒に使用すると、次のエラーが出る。 :1054 'having句'(SQL:select_count(*)は 'deleted_at'がヌルで' users'.getleted_at'が 'full_name' LIKE ad%を持つヌルである' users'からの集計として選択します) 。 それは...このための任意の解決策を全体的な結果をカウントしようとした? –

+0

@Olaszka私はエラーがクリアされていると思います。それはfull_name'が何であるかを '分かりません。私はあなたのように...'のような何かを忘れてしまったと思いますfull_name'を実行します。それ以外の場合は、新しい問題の質問を更新します。 –