2017-05-21 16 views
1

フィルタとして機能する入力フィールドを持つテーブルがあります。関係を持つOrdersテーブルとUsersテーブルの値があります。Laravel:クエリビルダとの関係

例えば:

Order Id  | User Full Name | Order Price | Date    | 

[order filter] [user name filter]    [order date filter] 

どのように関係を経由してユーザテーブルから値をフィルタリングすることができますか?

これは当然のエラーを返します:

public function name($name) 
{ 
    return $this->builder->where('name', 'LIKE', '%$name%')->orWhere('surname', 'LIKE', '%$name%'); 
} 

エラー:

QueryException in Connection.php line 770: 
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'name' in 'where clause' (SQL: select count(*) as aggregate from `orders` where (`name` LIKE %$name% or `surname` LIKE %$name%)) 
+0

あなたのカラム名は 'name'か' User Full Name'ですか?あなたのエラーメッセージは非常にクリア/シンプルです - > '列が見つかりません:1054不明な列 '名前句'の 'where句'。したがって、 'name'カラムは存在しないので、実際のカラム名は何ですか? – Sean

+0

あなたのクエリは、おそらく存在する関連ユーザテーブルではなく、ordersテーブルのカラム 'name'を探しています。 MySQLでクエリを書く方法を知っていますか? – sunomad

+0

@Sean、私はそれが存在しないことを知っています。私はユーザーのテーブルでそれを検索したい。 Ordersテーブルには関係がありますが、そのアクセス方法は問題です。 – Rudolph

答えて

3

あなたのクエリビルダに直接条件を追加したり、スコープを作成することができます。

オーダーモデルにこれを追加します。

public function scopeFilterUser($query, $name) 
{ 
    return $query->whereHas('user', function ($q) use ($name) { 
     $q->where('name', 'like', "%{$name}%") 
      ->orWhere('surname', 'like', "%{$name}%"); 
    }); 
} 

ので

$orders = Order::filterUser($name)->get(); 

が直接条件を適用するようにそれを使用してください。

$orders = Order::whereHas('user', function ($query) use ($name) { 
    $query->where('name', 'like', "%{$name}%") 
     ->orWhere('surname', 'like', "%{$name}%"); 
})->get(); 

編集:フィルタの方法に基づいています。

public function name($name) 
{ 
    return $this->builder->whereHas('user', function ($q) use ($name) { 
     $q->where('name', 'like', "%{$name}%") 
      ->orWhere('surname', 'like', "%{$name}%"); 
    }); 
} 
+0

別のフィルター方法を追加せずに行う方法はありますか?私はここのようにレンダリングされたテーブル全体をフィルタリングするクラスを1つ持っています - https://github.com/laracasts/Dedicated-Query-String-Filtering/blob/master/app/LessonFilters.php – Rudolph

+0

@ルドルフクエリスコープをフィルタメソッドに変換しました。私はあなたのためにそれを追加しました。私の答えをチェックしてください。 – Sandeesh

+0

ありがとう!魅力のように動作します。 – Rudolph