Laravel Query Builder를 사용하여 하위 쿼리에서 선택하는 방법은 무엇입니까?
Eloquent ORM을 사용하여 다음 SQL로 가치를 얻고 싶습니다.
-SQL
SELECT COUNT(*) FROM
(SELECT * FROM abc GROUP BY col1) AS a;
그런 다음 다음을 고려했습니다.
-코드
$sql = Abc::from('abc AS a')->groupBy('col1')->toSql();
$num = Abc::from(\DB::raw($sql))->count();
print $num;
더 나은 솔루션을 찾고 있습니다.
가장 간단한 해결책을 알려주세요.
@delmadord의 답변과 귀하의 의견 외에도 :
현재 FROM
절에 하위 쿼리를 생성하는 방법이 없으므로 원시 문을 수동으로 사용해야하며 필요한 경우 모든 바인딩을 병합합니다.
$sub = Abc::where(..)->groupBy(..); // Eloquent Builder instance
$count = DB::table( DB::raw("({$sub->toSql()}) as sub") )
->mergeBindings($sub->getQuery()) // you need to get underlying Query Builder
->count();
올바른 순서로 바인딩 을 병합 해야합니다 . 다른 바운드 절이있는 경우 다음 뒤에 넣어야합니다 mergeBindings
.
$count = DB::table( DB::raw("({$sub->toSql()}) as sub") )
// ->where(..) wrong
->mergeBindings($sub->getQuery()) // you need to get underlying Query Builder
// ->where(..) correct
->count();
Laravel v5.6.12 (2018-03-14) 추가 fromSub()
및 fromRaw()
쿼리 작성기에 메서드 (# 23476) .
허용되는 답변은 정확하지만 다음과 같이 단순화 할 수 있습니다.
DB::query()->fromSub(function ($query) {
$query->from('abc')->groupBy('col1');
}, 'a')->count();
위의 스 니펫은 다음 SQL을 생성합니다.
select count(*) as aggregate from (select * from `abc` group by `col1`) as `a`
@JarekTkaczyk의 해결책은 정확히 내가 찾던 것입니다. 내가 놓친 유일한 것은 DB::table()
쿼리를 사용할 때 수행하는 방법 입니다. 이 경우 다음과 같이합니다.
$other = DB::table( DB::raw("({$sub->toSql()}) as sub") )->select(
'something',
DB::raw('sum( qty ) as qty'),
'foo',
'bar'
);
$other->mergeBindings( $sub );
$other->groupBy('something');
$other->groupBy('foo');
$other->groupBy('bar');
print $other->toSql();
$other->get();
특별 하 atention는 방법을 만들기 위해 mergeBindings
사용하지 않고 getQuery()
방법을
laravel 5.5에는 하위 쿼리에 대한 전용 메서드가 있으며 다음과 같이 사용할 수 있습니다.
Abc::selectSub(function($q) { $q->select('*')->groupBy('col1'); }, 'a')->count('a.*');
또는
Abc::selectSub(Abc::select('*')->groupBy('col1'), 'a')->count('a.*');
원하는 쿼리를 수행하도록 코드를 만들 수 없습니다. AS는 abc
파생 테이블이 아니라 테이블에 대한 별칭 입니다. Laravel Query Builder는 파생 테이블 별칭을 암시 적으로 지원하지 않으며 DB :: raw가이를 위해 가장 많이 필요합니다.
내가 생각해 낼 수있는 가장 직접적인 해결책은 당신의 것과 거의 동일하지만 당신이 요청한대로 쿼리를 생성합니다.
$sql = Abc::groupBy('col1')->toSql();
$count = DB::table(DB::raw("($sql) AS a"))->count();
생성 된 쿼리는
select count(*) as aggregate from (select * from `abc` group by `col1`) AS a;
나는 다음과 같은 것을 좋아합니다.
Message::select('*')
->from(DB::raw("( SELECT * FROM `messages`
WHERE `to_id` = ".Auth::id()." AND `isseen` = 0
GROUP BY `from_id` asc) as `sub`"))
->count();
매우 우아하지는 않지만 간단합니다.
참고URL : https://stackoverflow.com/questions/24823915/how-to-select-from-subquery-using-laravel-query-builder
'programing' 카테고리의 다른 글
어떤 유닉스 셸을 사용하고 있는지 어떻게 알 수 있습니까? (0) | 2020.10.07 |
---|---|
rsync가 .htaccess 파일을 동기화하지 않습니다. (0) | 2020.10.07 |
객체 배열에서 React 컴포넌트 렌더링 (0) | 2020.10.07 |
데이터베이스 테이블의 임의 레코드 (T-SQL) (0) | 2020.10.07 |
WPF ListView : 항목에서 두 번 클릭 이벤트 첨부 (0) | 2020.10.07 |