2009-02-23 6 views
7

हमारे पास एक लिंक टेबल है जो एक तरफ कई प्रकार के ऑब्जेक्ट को संभाल सकती है, और मैं इन वस्तुओं में से किसी एक से हैस_मनी का उपयोग करके लिंक टेबल पर कैसे पहुंच सकता हूं।मैं एक निश्चित जॉइन स्थिति के साथ डीबीआईएक्स :: कक्षा संबंध कैसे बना सकता हूं?

उदाहरण: लिंक तालिका में शामिल हैं:

Resource->has_many(links => 'Link', 'resource_id'); 

लेकिन मैं इसी प्राप्त करने में सक्षम नहीं किया गया:

id link_id link_table resource_id 
1 1  page  3 
2 1  page  5 
3 2  page  3 
4 1  not_page 1 

संसाधन की ओर से संबंध का निर्माण बहुत आसान है पृष्ठ की ओर से संबंध:

Page->has_many(links => 'Link', 'link_id'); 

not_page लिंक

Page->has_many(links => 'Link', {'foreign.link_id' => 'self.id', 'foreign.link_table' => 'page'}); 

'अमान्य rel cond वैल पेज' त्रुटि (जो मेरे लिए है कि आश्चर्य की बात नहीं थी) देता है मिलेगा।

Page->has_many(links => 'Link', {'foreign.link_id' => 'self.id', 'foreign.link_table' => '"page"'}); 

एक 'अमान्य रिव कंड वैल' पृष्ठ '' त्रुटि देता है। बैकस्लाश फेंकने में मदद नहीं मिली।

DBIx::Class::Relationship::Base का कहना है:

:

हालत जैसे टेबल

और मैं वहाँ से विभिन्न विभिन्न विकल्पों की कोशिश की है, के बीच में शामिल होने का एक SQL::Abstract शैली प्रतिनिधित्व होने की जरूरत है

Page->has_many(links => 'Link', {'foreign.link_id' => 'self.id', 'foreign.link_table' => {'=', 'page'}}); 

लेकिन बिना किसी सफलता के।

अगर मैं जो हमेशा मूल्य 'पेज' में शामिल है पृष्ठ सारणी के लिए एक और क्षेत्र जोड़ा मैं

Page->has_many(links => 'Link', {'foreign.link_id' => 'self.id', 'foreign.link_table' => 'self.what_table_am_i'}); 

कर सकता है, लेकिन वह शायद ही सर्वोत्कृष्ट समाधान है।

लिंक तालिका को प्रत्येक प्रकार के लिए एक अलग में विभाजित करना एक संभावना हो सकती है, लेकिन यह एक मौजूदा परियोजना है जिसे डीबीआईएक्स :: कक्षा के अनुकूलन के लिए माना जा रहा है, और अन्य जगहें हो सकती हैं जहां एक टेबल को एकाधिक में विभाजित किया जा सकता है अन्य टेबल इसके लायक से अधिक परेशानी है।

Page->has_many(__all_links => 'Link', 'link_id'); 

sub links { 
    shift->__all_links({link_table => 'page'}); 
} 

यह एक DBIx :: कक्षा घटक में बदलने के लिए आप एक से अधिक तालिकाओं की आवश्यकता है कि अगर बहुत आसान होगा:

+0

आप "has_many" के दूसरे पक्ष पर "belongs_to" करना चाहते हैं? – jrockway

+0

है_मनी अधिक महत्वपूर्ण था, इसलिए मैंने जरूरी से ज़्यादा जटिलताओं को जोड़ने के लिए चुना नहीं। मुझे उम्मीद है कि ब्रायन का जवाब संबंधित_तो मामले के लिए संशोधित करने में सक्षम है। – Cebjyre

उत्तर

3

तुम सिर्फ एक आवरण विधि है कि आवश्यक तर्क के साथ संबंध कॉल करना चाहिए तर्क में शामिल होने के इस प्रकार।

+0

शानदार, धन्यवाद। एक कुकी है – Cebjyre

+0

और फिर खोज() के साथ इसका उपयोग कैसे किया जा सकता है? मैंने कोशिश की: $ सी-> मॉडल ('पृष्ठ') -> खोज (अनिश्चित, {prefetch => "लिंक"}) -> सभी; लेकिन यह कहता है: डीबीआईएक्स :: कक्षा :: परिणामसेट :: सभी(): पृष्ठ पर इस तरह के कोई रिश्ते लिंक नहीं है –

1

यह बहुत तरह has_many कॉल में निर्दिष्ट किया जा सकता:

Page->has_many(links => 'Link', 'link_id', 
        { where => { link_table => 'page'} }); 

देखें: DBIx::Class Cookbook

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^