web-dev-qa-db-ja.com

Laravel withCountメソッドでwhere句を使用する

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

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

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

SQLSTATE [42S22]:列が見つかりません:1054不明な列 'upvotes_count' in 'where句'(SQL:select 、(select count()from upvotes where upvotes.upvoteable_id = posts.id and upvotes.upvoteable_type = App\Post)as upvotes_count from postsここでupvotes_count> 5)

だから私が推測できることから、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:select 、(select count()from upvotes where upvotes.upvoteable_id = posts.idおよびupvotes.upvoteable_type = App\Postおよびupvotes_count> 5) postsからupvotes_countとしてid = 1)

コード。

$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:select * from posts where id = 1 and upvotes_count> 5)


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

12
slapbot

以下を使用して、要求された結果を得ることができます。

$posts = Post::withCount('upvotes')
         ->having('upvotes_count', '>', 5)
         ->get();
17
Medin Piranej

これがあなたの質問の後に実装されたかどうかはわかりませんが、今はこのように行うことができます

$posts = Post::has('upvotes','>',5)->get();
4

私は同じ問題に遭遇し、あなたがしたのと同じことを試しました。 withCounts呼び出しで生成されたSQLを複製する方法があると思いますが、where句でxxx_countsを使用できるようにする方法を追加していますが、代わりに結果のコレクションをフィルター処理しました。

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

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

カウンターが1以上の行のみを選択する必要がある場合は、次のコードを試すことができます。

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

これが最良の解決策かどうかはわかりませんが、代替策です。別の選択肢は、上記のコメントで述べたように、投稿を取得して配列フィルターを使用することです。

1
Felipe Loge

これを行うもう1つの良い方法は、個別にフィルター処理し、その列名にエイリアスを割り当てることです。

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

今、ブレードで行うことができます

$posts->upvotes_count
0
Yousef Altaf

Has()を使用するのが最善の解決策だと思います:

Post::has('upvotes','>',5)->withCount('upvotes')->get()

フィルターを使用することもできます。

Post::withCount('upvotes')->get()->filter(function($post) { return $post->upvotes_count > 5; })

Config/database.phpでstrictモードを無効にすることもできます(おそらく良いアイデアではありません)

'strict' => false,

Post::withCount('upvotes')->having('upvotes_count','>',5)->get()

(厳密モードで持つことを使用して)groupBy句を追加することもできますが、これにはおそらく「ONLY_FULL_GROUP_BY」が原因でテーブルにすべての列を含める必要があり、別の列をテーブル、そしておそらく私はあなたがgroupByに 'upvotes_count'を含める必要があると思うのでとにかく機能しないでしょう、そしてそれは非グループ化フィールドであるようです。

0
Keith Turkowski