2009-11-13 3 views
3

DBIx :: Class로 시작하고 DBIx :: Class에 있어야하는 subselect가 있지만 혼란스럽고 코드를 작성할 수 없습니다.DBIx :: Class로 Subselect하는 방법은 무엇입니까?

내 MySQL의 선택이 하나입니다

Select name from tblCategory where id = (
    Select id from tblCategory where id = (
     Select id from tblRadio where name = "RFM" 
    ) 
); 

나는 DBIx :: 클래스 부속 선택을 지원하지 않는다는 것을 읽을; 그게 사실이야? 그렇다면 이런 상황에서 당신은 무엇을합니까?

+0

이 순간에 코드를 다시 작성하고 있습니다 ... – Davidslv

답변

2

DBIC의 search() 메서드를 사용할 때 리터럴 SQL을 삽입 할 스칼라 참조를 항상 제공 할 수 있습니다. 예를 들면 :

내가 DBIC가 아웃 - 오브 - 박스 지원보다 더 표현력을 필요로 할 때 과거에해야 할 일을했을 것 무엇
my $rs = $schema->resultset('Category')->search({ 
       id => \"(Select id from tblRadio where name = 'RFM')" 
}); 

. 나는 그것이 "올바른"일인지 여부는 모르겠다.

+0

안녕하세요, 아마도 작동하지만, 그런 식으로 저는 DBIx의 클래스에서 "도망 가려고합니다": Class right? – Davidslv

+1

@ Dan : 반드시 그런 것은 아닙니다. DBIx :: Class는 만병 통치약이 아니며 평범한 SQL이하는 완전한 표현력을 가지고 있지 않습니다. ORM의 어떤 맛을 사용하든 작업이 제공하는 바를 벗어난 작업이 발생하고 기본 시스템으로 되돌아 가야합니다. 원칙적으로 DBIx :: Class에는 한계가 있습니다. 문제는 DBIC에서 지원하지 않는 기능에 의존하지 않도록 시스템을 구성 할 수 있는지 여부입니다. 나는 당신의 시스템을 모른다 : 당신이 조인만으로 성취 할 수있는 것인가? –

2

조인으로 표시 할 수 없습니까?

my $rs = $schema->resultset('Category')->search(
    { 
     'Radio.name' => 'RFM' 
    }, 
    { 
     'join' => 'Radio' 
    } 
); 

여기에는 '라디오'라는 범주의 관계가 있다고 가정합니다. 그렇지 않은 경우 relationships을 설정하고 joins을 수행하는 방법을 배우는 데 도움이되는 설명서가 많이 있습니다.

하위 쿼리의 경우 최신 버전의 요리 책에는 supported이지만 experimental이라고되어 ​​있습니다. 그것은 YMMV 그래서 실험을 표시됩니다

my $inside_rs = $schema->resultset('Radio')->search({ name => 'RFM' }); 

my $rs = $schema->resultset('Category')->search({ 
    id => { '=' => $inside_rs->get_column('id')->as_query }, 
}); 

:

+0

안녕하세요, 네 말이 맞아요.이 2 개의 테이블 (일차 ID가있는 세 번째 테이블과 관련된 다 대다 관계)과 관계가 있습니다. 이 tblCategoria에서 선택 tblCategoria.nome, tblCategoria.id, tblRadio.nome \t이 (tblCategoria.id = tblRadio.id) tblRadio에 tblRadio \t 가입 : 안녕하세요 조인 작업을 시도하고 있었다 나는이 일 .nome = 'rfm'; 이제 예제를 찾아 보겠습니다. 대단히 감사합니다. – Davidslv

0

: P 는 (! YEAH)

는 몇 가지 물건을 다시 작성했고, 잘 부속 선택과 수행의 관계를 잊고 있었다.

나는이 코드가 inicial 질문을 나타내지 않는다는 것을 안다. 그러나 내가 다시 모두 다시 써야한다면, 나는 당신에게 나의 "프로젝트"의 다른 부분을 보여줄 것이다. 여기서 또 다른 어려움이있다.

DBIx :: 클래스 스키마

package DB::Esquema::Passwords; 

use strict; 
use warnings; 

use base 'DBIx::Class'; 

__PACKAGE__->load_components("Core"); 
__PACKAGE__->table("Passwords"); 
__PACKAGE__->add_columns(
    "pswd", 
    { data_type => "INT", default_value => undef, is_nullable => 0, size => 11 }, 
    "password", 
    { 
    data_type => "VARCHAR", 
    default_value => undef, 
    is_nullable => 1, 
    size => 20, 
    }, 
    "utilizadorid", 
    { data_type => "INT", default_value => undef, is_nullable => 1, size => 11 }, 
); 
__PACKAGE__->set_primary_key("pswd"); 
__PACKAGE__->belongs_to('utilizadorid' => 'DB::Esquema::Utilizadores'); 
#belongs_to is not autogenerated, done by hand 

Utilizadores과 관계가 (사용자)

package DB::Esquema::Utilizadores; 

use strict; 
use warnings; 

use base 'DBIx::Class'; 

__PACKAGE__->load_components("Core"); 
__PACKAGE__->table("Utilizadores"); 
__PACKAGE__->add_columns(
    "utilizador", 
    { data_type => "INT", default_value => undef, is_nullable => 0, size => 11 }, 
    "nome", 
    { 
    data_type => "VARCHAR", 
    default_value => undef, 
    is_nullable => 1, 
    size => 20, 
    }, 
    "mail", 
    { 
    data_type => "VARCHAR", 
    default_value => undef, 
    is_nullable => 1, 
    size => 30, 
    }, 
); 
__PACKAGE__->set_primary_key("utilizador"); 
__PACKAGE__->has_one('utilizador' => 'DB::Esquema::Passwords', 'utilizadorid'); 

NEXT (을 만들 수있는 스크립트를 :

다음으로 내가 한 일이다 작품)

#!/usr/bin/perl -w 

use strict; 
use diagnostics; #was important to understand 
use lib '/var/www/projectox/lib'; #is where the schema is 
use DB::Esquema; #use the Schema 

system('clear'); # clear the screen 

my $esquema = DB::Esquema->connect("dbi:mysql:dbname=dbswiak","root",""); 
    $esquema->storage->debug(1); 

    #HAD TO USE PREFETCH 
    my $resultado = $esquema->resultset('Utilizadores')->search(
    undef,{ 
     prefetch => { 'utilizador' => 'utilizadorid' } 
     } 
    )->next(); 

그 결과

SELECT me.utilizador, me.nome, me.mail, utilizador.pswd, 
utilizador.password, utilizador.utilizadorid, utilizadorid.utilizador, utilizadorid.nome, utilizadorid.mail 
FROM Utilizadores me JOIN Passwords utilizador 
ON utilizador.utilizadorid = me.utilizador 
JOIN Utilizadores utilizadorid ON utilizadorid.utilizador = utilizador.utilizadorid: 

는, 목표는 아마 내가

0

부속 선택이 실험이다 그 목표에 도달 할 것 ... 내가 원하는 열만을 선택하는 것입니다 내가 정말 원하는 것을 아니었지만, 가장 가까운입니다 기능을 제공하고 컴파일 타임에 허용 할 수 있어야하는 경우 유용합니다. 그러나 나는 다음과 같은 좋은 접근 방법을 찾는다.

(1) 대부분의 subselect는 (더 빠른) 조인으로 수행 할 수 있습니다. 따라서 (2)이 실패하는 조인을 사용하여 데이터베이스에서 뷰를 만들고 뷰의 스키마 클래스를 만듭니다.