2012-05-14 10 views
5

मैं केकपीएचपी में संबंधों के माध्यम से कई द्वि-दिशात्मक आत्म-संदर्भित के आसपास अपना सिर प्राप्त करने की कोशिश कर रहा हूं (क्या एक मुट्ठी भर!)।केकपीएचपी: द्वि-दिशात्मक आत्म-संदर्भित कई संगठनों के माध्यम से

मैं एक तस्वीर मिलान वेबसाइट पर काम कर रहा हूं।

  • चित्र 'चित्र' (शामिल मॉडल) के माध्यम से अन्य चित्रों से जुड़े होते हैं।
  • प्रत्येक मैच में दो चित्र हैं और वर्तमान रेटिंग और वोटों की कुल संख्या स्टोर करते हैं।
  • कोई चित्र देखने पर, किसी भी दिशा से इसकी सभी संबंधित छवियां उपलब्ध होनी चाहिए (इसके मैचों के माध्यम से)।

मैंने एक मॉडल मॉडल के साथ संबंधों के माध्यम से एक हैनी को परिभाषित करके शुरू किया है।

pictures_matches में शामिल होने तालिका इस संरचना है:

id | picture_id | partner_id | rating | total_votes 

मेरे मैच में शामिल मॉडल संघ इस तरह दिखता है:

class PictureMatch extends AppModel { 

... 

    public $belongsTo = array(
     'Picture' => array(
      'className' => 'Picture', 
      'foreignKey' => 'picture_id', 
      'conditions' => '', 
      'fields' => '', 
      'order' => '' 
     ), 
     'Partner' => array(
      'className' => 'Picture', 
      'foreignKey' => 'partner_id', 
      'conditions' => '', 
      'fields' => '', 
      'order' => '' 
     ) 
    ); 
} 

प्रत्येक चित्र भी दिशा से इससे संबंधित चित्रों उपयोग करने में सक्षम होने की जरूरत है, लेकिन यह वह जगह है जहां मेरी समझ फिसल रही है। ऐसा लगता है कि मुझे रिश्ते के दोनों पक्षों को बचाने की ज़रूरत है, लेकिन यह दो डीबी प्रविष्टियों के साथ जुड़ने वाले मॉडल में संग्रहीत अतिरिक्त डेटा को नष्ट कर देता है, दिशा के आधार पर मतदान अलग-अलग हो सकता है।

क्या कोई भी केकपीएचपी में ऐसा करने के लिए सबसे अच्छा तरीका किसी भी प्रकाश को छोड़ सकता है? मैं उलझन में हूँ।
क्या फ्लाई पर व्यस्त संबंध बनाना संभव है?

+3

क्या आपने कभी यह पता लगाया है? –

+0

क्या पार्टनर अनुभाग के तहत क्लासनाम 'पार्टनर' होना चाहिए? – khany

उत्तर

0

आप फ्लाई vie मॉडल :: bindModel() पर रीयलशन बना सकते हैं, बहुत उपयोगी चीजें जो आपको रिवर्स रिश्तों को बांधने या किसी भी दिशा में उड़ने के लिए बाध्य करती हैं।

http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html

इसके अलावा रखने योग्य व्यवहार का उपयोग कर आप अपने संबद्ध तारीख पूर्व पुन: प्राप्त करने के अनंत श्रृंखला बना सकते हैं।

होते हैं ('Picture.PictureMatch.Partner.PictureMatch.Picture .....')

मूल रूप से आप जब तक अपने सभी मॉडलों के रूप में प्रत्येक श्रृंखला किसी भी तरह अगले एक से संबंधित है के माध्यम से लूप व्याख्या करने के लिए कर सकते हैं यह बेहतर सरल उदाहरण (कृपया उपेक्षा उस में तर्क)

सर्किल belongsTo स्क्वायर स्क्वायर belongsTo त्रिभुज

तो त्रिभुज सर्किल (सीधे) से संबंधित नहीं है, लेकिन स्क्वायर में थोड़े है

के बीच

या अधिक मस्ती करने के लिए चारों ओर

Circle->find('all', array('...', contain => array('Square.Trinagle.Square.Circle')); 

पाश के साथ सर्कल द्वारा चक्र पाने और इतने पर, बेशक उन उदाहरण बेकार है और किसी भी प्रोग्रामिंग तर्क बिना कर रहे हैं, लेकिन मुझे आशा है कि आप बिंदु समझते हैं कि आप कर सकते हैं की सुविधा देता है पीछे और आगे जा रहे संबंधों की लूप असीमित संख्या।

0

मुझे यकीन है कि अगर यह सबसे अच्छा समाधान है नहीं कर रहा हूँ, लेकिन अगर आप ऐसा किया: फिर जब आप कोई खोज करते हैं तो आप सिर्फ ($this->data['Picture1'] == $var || $this->data['Picture2'] == $var) के लिए खोज और इतने लंबे समय के रूप में आप recursive 1 या 2 के लिए सेट है

public $belongsTo = array(
    'Picture1' => array(
     'className' => 'Picture', 
     'foreignKey' => 'picture_id', 
    ), 
    'Picture2' => array(
     'className' => 'Picture', 
     'foreignKey' => 'picture_id', 
    ), 
    'Partner' => array(
     'className' => 'Partner', 
     'foreignKey' => 'partner_id', 
    ), 
); 

आपको उस Picture के लिए सभी संबंधित डेटा वापस लेना चाहिए।

0

मुझे लगता है यह छोड़ दिया जाता है, लेकिन यह आसानी से समाधान योग्य है - यह चरण

में शामिल होने के मॉडल

में संग्रहीत अतिरिक्त डेटा को नष्ट कर देता के साथ क्या करना है इसका मतलब है कि आपके बचाता चल रहे हैं एक deleteAll और मिलान पर रिकॉर्ड डालने ... इसके बजाय आपको उस रिकॉर्ड को खोजने और अपडेट करने की आवश्यकता है ...

यह कुछ तरीकों से किया जा सकता है, लेकिन आपकी बचत कॉल से पहले सबसे आसान है, इसे देखो, और प्राइ शामिल करें मैच रिकॉर्ड डेटा में मैरी कुंजी। असल में इसे एक एचएबीटीएम के रूप में सहेजें नहीं, और केवल इसे एक के रूप में सहेजें यदि आप पहले से ही मौजूदा मिलान रिकॉर्ड प्राथमिक कुंजी (id) ढूंढने का प्रयास कर चुके हैं और डेटा को इसके साथ सहेजने के लिए अपडेट किया है।

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