जटिल क्वेरी से निपटने के लिए एक और तरीका है उन में परिभाषित करने के लिए है एक DBIx::Class::ResultSource::View तो जैसे:
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
]
);
तो आप इसे कॉल कर सकते हैं के रूप में आप सामान्य रूप से dbix कहेंगे :: वर्गों और आप एक DBIx मिल जाएगा: : कक्षा :: ResultSet वस्तु (, अद्यतन अनुमति देते हैं जो नहीं करने या हटाने हालांकि):
my $pruned_cdr = $schema->resultset('ComplexQuery')->search({}, { ... });
इस विधि की अच्छी बात यह है कि यह जटिल प्रश्न (जैसे कि जब आप एक से अधिक जटिल मिलती है या यूनियनों, उप चयन है की अनुमति देता है इत्यादि) को अपने कोड से एक परिणाम स्रोत :: वीआई में छिपाने के लिए ईडब्ल्यू, तो आप एसक्यूएल सिंटैक्स और ऑब्जेक्ट्स का मिश्रण छिपाते हैं
यह समाधान वास्तव में काम करता है। मुझे खेद है कि एकमात्र चीज यह है कि यह वस्तुओं के उपयोग के साथ एसक्यूएल वाक्यविन्यास मिश्रण करता है। इसलिए, अगर हमें कुछ एसक्यूएल बिट्स रखने के लिए मजबूर किया जाता है, तो क्या डीबीआईएक्स :: क्लास को सरल डीबीआई पर उपयोग करने में वास्तविक रुचि है? – galli2000
आपकी वांछित केस अभिव्यक्ति को शामिल करने का कोई अन्य तरीका नहीं है। यह डीबीआईएक्स :: कक्षा की ऑब्जेक्ट सिंटैक्टिक चीनी में शामिल नहीं है। – dgw
@ galli2000 डीबीआईसी सिर्फ एक एसक्यूएल जेनरेटर नहीं है। यह उपयोगी वस्तुओं, prunes में शामिल होने की स्थिति, और भी बहुत कुछ उत्पन्न करता है। –