2016-09-02 5 views
-3

question의 mysql 쿼리가 있습니다. 해당 DBIx :: Class 구문?

SELECT a.* 
FROM products a 
INNER JOIN product_tags b ON a.product_id = b.product_id 
WHERE b.tag_id IN (1,23,54) 
GROUP BY a.product_id 
HAVING COUNT(1) = 3 

나는이 DBIx::Class 구문으로 전환 얻는 방법을 내려고 노력하고 있어요?

(DBIx docs에서 가져온 것입니다.) 이것이 조인에 관한 내용입니다. 그러나이를 통합하는 방법을 모르겠습니다.

정의 조인 관계 DBIx :: 클래스^

개의 테이블 간의 관계를 각각 제 테이블의 ResultSource에서 정의 될 필요가있다. 관계를 양방향으로 액세스해야하는 경우 (즉, CD의 모든 트랙을 가져오고 트랙의 CD 데이터를 가져 오는 경우), 두 테이블 모두에 대해 관계를 정의해야합니다. 복구 CD를 들어

이/MYSCHEMA :: CD에 쓰기를 의미, 예를 트랙 :

MySchema::CD->has_many('tracks', 'MySchema::Tracks'); 

그리고 MYSCHEMA :: 트랙에서 : 관계의 여러 가지 다른 종류가

MySchema::Tracks->belongs_to('cd', 'MySchema::CD', 'CDID'); 

있습니다, DBIx :: Class :: Relationship에서보다 포괄적으로 설명됩니다. 조인 사용^

모든 관계를 정의한 후에는 실제 조인에서 사용하면 매우 간단합니다. 예를 들어 선택한 관계 유형입니다. has_many는 이미 수행 할 조인의 종류를 나타냅니다. has_many는 예를 들어 LEFT JOIN을 생성합니다. 오른쪽에 일치하는 행 (조인중인 테이블)이 있는지 여부에 관계없이 왼쪽의 모든 행을 페치합니다. 관계에 다른 유형의 조인을 강요 할 수 있습니다 (DBIx :: Class :: Relationship 문서 참조).

검색 또는 찾기 작업 중 하나를 수행 할 때,이처럼이 속성을 결합하여,도에 따라 결과를 구체화 할 관계 지정할 수 있습니다

$schema->resultset('CD')->search(
    { 'Title' => 'Funky CD', 
     'tracks.Name' => { like => 'T%' } 
    }, 
    { join  => 'tracks', 
     order_by => ['tracks.id'], 
    } 
); 

당신의 대부분을 인식하지 않는 경우 이 구문을 사용하면 DBIx :: Class :: ResultSet의 "search"와 DBIx :: Class :: ResultSet의 "ATTRIBUTES"를 읽어야하지만 다음은 빠르다고 생각합니다.

검색의 첫 번째 인수는 a입니다. WHERE 속성의 hashref,이 경우에는 CD 테이블의 Title 열에 대한 제한 및 Tracks 테이블에있는 트랙의 이름에 대한 제한 인 bu 선택한 CD에 실제로 관련된 트랙에만 해당됩니다. 두 번째 인수는 검색에 대한 속성의 hashref이며, 결과는 관련 트랙의 id로 정렬되어 반환됩니다.

+0

안녕하세요 abra 어떤 의견이 있습니까? DBIx에서 일해 보셨습니까? DBIx에 대해 알고 있습니까? 친구 중 누구라도 DBIx를 알고 있습니까? pl은 그들에게이 질문을 보여줍니다. – rajeev

+0

DBIx는 DBIx :: Class가 하나의 모듈 인 전체 네임 스페이스입니다. DBIx :: Class의 약어는 DBIC입니다. –

답변

2

먼저 제품의 태그에 rel을 정의하십시오.

MySchema::Result::Product->has_many(
    'tags', 'MySchema::Result::ProductTag', 'product_id' 
); 

Thne 태그에서 제품에 확인해 정의 :

당신이 방법으로 스키마 :: 로더를 사용한다면이 이미 추정되었을 것입니다
MySchema::Result::ProductTag->belongs_to(
    'products', 'MySchema::Result::Product', 'product_id' 
); 

.

$schema->resultset('Product')->search({ 
    tags.tag_id => { -in => [1,23,54] }, 
}, { 
    join => 'tags', 
    group_by => 'me.product_id', 
    having => { 'count 1' => 3 }, 
}) 
: 이제

원래 쿼리를 복제 할 : (뻔뻔 플러그는 위 DBIx :: 클래스 :: 사탕과 DBIx :: 클래스 :: 도우미 :: 행 :: RelationshipDWIM와 짧고 달콤한 것)

+0

이 (가) 허용되었습니다. 시간을 내서 도와 주었다. Frew. DBIx에 대해 전혀 알지 못하지만 투표가 중단되고 비판 할 준비가되어있는 많은 사이트 관리자는 여러 번 더 낫습니다. – rajeev

관련 문제