Có ai biết DBIx :: Class tương đương với một truy vấn SQL như là những gì:Cú pháp DBIx :: Class cho CASE KHI NÀO ... Cú pháp SQL THÌ?
CHỌN cdr_id, CASE KHI service_id = 'GPRS' THEN 'KB' KHI service_id = 'SMS' THEN 'SMS' END AS đơn vị TỪ ...
Cảm ơn
Có ai biết DBIx :: Class tương đương với một truy vấn SQL như là những gì:Cú pháp DBIx :: Class cho CASE KHI NÀO ... Cú pháp SQL THÌ?
CHỌN cdr_id, CASE KHI service_id = 'GPRS' THEN 'KB' KHI service_id = 'SMS' THEN 'SMS' END AS đơn vị TỪ ...
Cảm ơn
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.
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.
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
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
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
@ 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. –