programing

withCount 메서드에서 where 절을 사용하는 Laravel

sourcejob 2023. 9. 16. 08:59
반응형

withCount 메서드에서 where 절을 사용하는 Laravel

저는 이 코드 조각을 사용하여 laravel의 유창한 쿼리 빌더의 카운트 방법으로 where 절을 하려고 합니다.

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

그리고 이 코드는 나에게 이 오류를 주고 있습니다.

SQLSTATE[42S22]:열을 찾을 수 없음: 1054 'where 절'의 알 수 없는 열 'upvotes_count'(SQL: select , (count() 선택 항목)upvotes어디에upvotes.upvoteable_id=posts.id그리고.upvotes.upvoteable_type= 앱\게시):upvotes_count부터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 , (count() 선택 항목에서 선택)upvotes어디에upvotes.upvoteable_id=posts.id그리고.upvotes.upvoteable_type= 앱\게시 및upvotes_count> 5) 로서upvotes_count부터posts어디에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 'where 절'의 알 수 없는 열 'upvotes_count'(SQL: select * fromposts어디에id= 1 그리고upvotes_count> 5)


저는 단지 상위 모델과 관계가 있는 카운트() 방법에 대한 where 절을 사용하고 싶습니다.

다음을 사용하여 요청한 결과를 얻을 수 있습니다.

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

이것을 하는 또 다른 좋은 방법은 우리가 그것을 별도로 필터링할 수 있고 심지어 그 열 이름에 별칭을 할당할 수도 있습니다.

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

이제 블레이드를 통해 가능합니다.

$posts->upvotes_count

질문하신 후에 시행이 되었는지는 잘 모르겠지만, 이제 이렇게 하시면 됩니다.

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

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'로 인해). 테이블에 다른 열을 추가할 경우 깨질 수 있습니다.그리고 아마 'upvotes_count'를 by 그룹에 포함시켜야 할 것 같고 그룹화되지 않은 필드인 것 같기 때문에 어쨌든 작동하지 않을 것입니다.

카운터가 1보다 크거나 같은 행만 선택해야 하는 경우 다음 코드를 시도할 수 있습니다.

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

이게 최선의 해결책인지는 모르겠지만 대안입니다.또 다른 방법은 위의 댓글에 언급된 것처럼 게시물을 받고 배열 필터를 사용하는 것입니다.

저도 같은 문제에 부딪혔고, 당신이 했던 것과 같은 것들을 시도했습니다.withCounts 호출로 생성된 SQL을 복제하되 where 절에 xxx_counts를 사용할 수 있도록 하는 방법을 추가하는 방법이 있다고 생각하지만, 결과 수집을 필터링했을 뿐입니다.

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

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

언급URL : https://stackoverflow.com/questions/39930975/laravel-using-where-clause-on-a-withcount-method

반응형