2012-02-08 21 views

Trả lời

6
my $rs = $schema->resultset('table')-> 
    search_rs({} , 
       { '+columns' => { 
        unit => 
         \do { "CASE WHEN me.service_id='GPRS' THEN 'KB' " . 
           "WHEN me.service_id='SMS' THEN 'SMS' END" } 
       }) ; 

cái gì đó dọc dòng này nên làm việc.

+0

Giải pháp này hoạt động thực sự. Điều duy nhất tôi rất tiếc là nó trộn cú pháp SQL với các đối tượng sử dụng. Vì vậy, nếu chúng ta buộc phải giữ một số bit SQL, thì có thực sự quan tâm đến việc sử dụng DBIx :: Class trên DBI đơn giản không? – galli2000

+1

Không có cách nào khác tôi biết để bao gồm biểu thức trường hợp mong muốn của bạn. Nó không được bao gồm trong đường cú pháp đối tượng của DBIx :: Class. – dgw

+1

@ galli2000 DBIC không chỉ là Trình tạo SQL. Nó cũng tạo ra các đối tượng hữu ích, mận điều kiện tham gia, và nhiều hơn nữa. –

-1

Tạo một bảng "service_units" dân cư với:

service | unit 
--------+----- 
GPRS | KB 
SMS  | SMS 

sau đó

SELECT 
    cdr.cdr_id, service_units.unit 
FROM 
    cdr INNER JOIN service_units ON cdr.service_id = service_units.service 

sau đó dịch đó vào DBIx :: Class speak.

2

Một cách khác để đối phó với các truy vấn phức tạp là xác định chúng trong một DBIx::Class::ResultSource::View như vậy:

package My::Schema::Result::ComplexQuery 
use strict; 
use warnings; 
use base qw/DBIx::Class::Core/; 

__PACKAGE__->table_class('DBIx::Class::ResultSource::View'); 
__PACKAGE__->table('tablename'); 
__PACKAGE__->result_source_instance->is_virtual(1); 
__PACKAGE__->result_source_instance->view_definition(
    q[ 
     SELECT cdr_id, 
     CASE WHEN service_id = 'GPRS' THEN 'KB' WHEN service_id = 'SMS' THEN 'SMS' END AS unit 
     FROM table 
    ] 
); 

sau đó bạn có thể gọi nó như bạn sẽ gọi DBIx :: lớp bình thường và bạn sẽ nhận được một DBIx: : đối tượng class :: ResultSet (mà sẽ không cho phép cập nhật hoặc xóa, mặc dù):

my $pruned_cdr = $schema->resultset('ComplexQuery')->search({}, { ... }); 

Những điều tốt đẹp về cách tiếp cận này là nó cho phép truy vấn phức tạp (như khi bạn có nhiều phức tạp tham gia hoặc đoàn thể, lựa chọn phụ vv) được ẩn từ mã của bạn thành một ResultSource :: Vi ew, vì vậy, bạn ẩn kết hợp cú pháp và đối tượng SQL

Các vấn đề liên quan