2016-10-08 32 views
0

このコードを使用して、laravelの雄弁なクエリービルダーのwithCountメソッドでwhere句を実行しようとしています。Laravel withCountメソッドのwhere節を使用

$posts = Post::withCount('upvotes')->where('upvotes_count', '>', 5)->get(); 

このコードは私にこのエラーを与えています。

SQLSTATE [42S22]:見つからないカラム:1054不明な列 'upvotes_count' 'where句'(SQLで:を選択し、(SELECT COUNT(upvotesupvotesからupvoteable_id = postsidupvotespostsどこupvotes_count> 5からupvotes_countなど。upvoteable_type =のApp \ポスト))

だから私は推測することができるものから、私は目を実行した場合upvotes_countが選択されていないので、列が発見されていないが、それでありますコードの一部です。

$posts = Post::withCount('upvotes')->get(); 

次に、私はこの出力を得ています。

{ 
"id": 1, 
"user_id": 15, 
"title": "Voluptatum voluptas sint delectus unde amet quis.", 
"created_at": "2016-10-07 13:47:48", 
"updated_at": "2016-10-07 13:47:48", 
"upvotes_count": 7 
}, 
{ 
"id": 2, 
"user_id": 2, 
"title": "Molestiae in labore qui atque.", 
"created_at": "2016-10-07 13:47:48", 
"updated_at": "2016-10-07 13:47:48", 
"upvotes_count": 2 
}, 

これは基本的にupvotes_countが選択されていることを意味します。したがって、この問題を解決する方法については本当に混乱しています。

(私はこれまで試みその他のオプションは、それに関連するそれぞれのエラーと以下の通りである。)

$posts = Post::where('id', $id)->withCount(['upvotes' => function($query) { 
     $query->where('upvotes_count', '>', 5); 
    }])->get(); 

エラー。

SQLSTATE [42S22]:列が見つかりません:1247リファレンス 'upvotes_count' サポートされていません(項目リストで前方参照)(SQLは:。(、upvotesupvotesupvoteable_id = postsから選択数()を選択します。 upvotes_countとしてidupvotesupvoteable_type =のApp \ポストと> 5 upvotes_countid = 1)

コードpostsから。

$posts = Post::where('id', $id)->with(['upvotes' => function($query) { 
     $query->select('upvoteable_id AS upvotes_count'); 
    }])->where('upvotes_count', '>', 5)->get(); 

$posts = \App\Post::where('id', $id)->with(['upvotes' => function($query) { 
     $query->selectRaw('upvoteable_id AS upvotes_count'); 
    }])->where('upvotes_count', '>', 5)->get(); 

エラー。

SQLSTATE [42S22]:見つからないカラム:1054不明な列 'upvotes_count 'where句' で:


(SQL *選択posts = 1 idupvotes_count> 5から)

親モデルとの関係にあるcount()メソッドでwhere句を使いたいだけです。

答えて

-1

、uは「upvotes_count」 と呼ばれるデータベースの列が多分withCountの関数の戻り値は、それは私が同じ問題に遭遇した

+0

はテーブル「upvotes_count」と呼ばれる何の列がありませんクエリビルダーのインスタンス – Drazxier

+0

あなたの問題は1行で教えてください。 私はあなたがupvotesが数よりも少ない行を持って来るdbを求めるwhere句を作成しようとしていることがわかり、upvotes countと呼ばれる列はありません:D 今何が問題ですか? –

+3

私はあなたとの会話が大好きで、SOのコメントはそれのための最良の場所ではないので、Facebookの会話を続けましょう。 – Drazxier

1

存在しないので、そうuがupvotes_count得ることはありません、あなたのDB ないupvotes_count持っていることを確認してくださいあなたがしたのと同じことを試みました。私はwithCountsの呼び出しで生成されたSQLを複製する方法があると思うが、xxx_countをwhere節で使用できるようにする方法を追加するが、その代わりに結果のコレクションをフィルタリングした。あなたはカウンターがあなたがフォローコードを試すことができます1以上である行だけを選択する必要がある場合は

$allTags = Tag::withCount('articles')->get(); 

$usedTags = $allTags->filter(function ($value, $key) { 
     return $value->articles_count > 0; 
    }); 
+1

かなり時間がありました.SQLについてもっと学んだので、集計関数のwhere節を実行することはできません。したがって、集計されて選択されていないため、upvotes_count列が見つかりません。 しかし、上記の問題は、いくつかの高度なクエリを使用してそれらを一緒にグループ化することで解決できます。 – Drazxier

1

$posts = Post::withCount('upvotes') 
      ->havingRaw('upvotes_count') 
      ->get(); 

を、これが最善の解決策であるかどうかは知らないが、それは代案です。もう1つの選択肢は、上記のコメントで述べたように投稿を取得し、配列フィルターを使用することです。

1

あなたが使用して要求された結果を達成することができます:私はこの「upvotes_count」列を追加し、その結果withCount()メソッドを使用して、それを選択していて、

$posts = Post::withCount('upvotes') 
     ->having('upvotes_count', '>', 5) 
     ->get(); 
+0

それは受け入れられた答えでなければなりません! – JCarlos