2015-06-19 7 views
6

में उसी मॉडल के लिए एकाधिक एसोसिएशन मैं केकेपीएचपी संस्करण 3.x का उपयोग कर रहा हूं।केकेपीएचपी 3

जब मैं संदेशटेबल से पूछता हूं तो मैं प्रेषक और संदेश प्राप्तकर्ता के लिए उपयोगकर्ता डेटा प्राप्त करना चाहता हूं। मैंने केकपीएचपी 2 में कई बार ऐसा किया है लेकिन मुझे पता नहीं लगा कि यह संस्करण 3.x में क्यों काम नहीं कर रहा है।

मेरे पास एक उपयोगकर्ताटेबल और एक संदेश योग्य है।

UsersTable

$this->hasMany('Messages'); 

MessagesTable

$this->belongsTo('Users', [ 
    'foreignKey' => 'sender_id', 
    'propertyName' => 'Sender', 
]); 
$this->belongsTo('Users', [ 
    'foreignKey' => 'user_id', 
    'propertyName' => 'Receiver' 
]); 

इस क्वेरी मैं

$messages = $this->Messages->find() 
     ->where(['Messages.user_id' => $this->Auth->user('id')]) 
     ->orwhere(['Messages.sender_id' => $this->Auth->user('id')]) 
     ->order(['Messages.created' => 'DESC']) 
     ->contain([ 
      'Users.Pictures', 
     ]); 

उपयोग कर रहा हूँ मैं रिसीवर डेटा को वापस नहीं बल्कि भेजने वाले डेटा के रूप में अच्छी तरह से हो रही है है। किसी भी मदद की वास्तव में सराहना की जाएगी

उत्तर

8

आपके संगठन गलत हैं। यदि एक से अधिक संघों आप अलग अलग उपनाम उपयोग करने की आवश्यकता के लिए एक ही मॉडल और className संपत्ति (बस CakePHP 2 की तरह) का उपयोग करते हुए: -

$this->belongsTo('Sender', [ 
    'className' => 'Users', 
    'foreignKey' => 'sender_id', 
    'propertyName' => 'sender', 
]); 
$this->belongsTo('Receiver', [ 
    'className' => 'Users', 
    'foreignKey' => 'user_id', 
    'propertyName' => 'receiver' 
]); 

यह described in the docs है।

आपके उदाहरण कोड में ReceiverUser के लिए एसोसिएशन को ओवरराइट कर रहा है ताकि आप परिणामों में केवल Receiver मॉडल देख सकें।

$messages = $this->Messages->find() 
    ->where(['Messages.user_id' => $this->Auth->user('id')]) 
    ->orwhere(['Messages.sender_id' => $this->Auth->user('id')]) 
    ->order(['Messages.created' => 'DESC']) 
    ->contain([ 
     'Receivers' => ['Pictures'], 
     'Senders' => ['Pictures'] 
    ]); 
+0

प्रतिक्रिया @drmonkeyninja के लिए धन्यवाद। आपका सुझाव मैंने पहली कोशिश की थी, लेकिन इससे मुझे एक त्रुटि मिली कि संदेश उपयोगकर्ताओं से जुड़े नहीं हैं, भले ही वे जुड़े हुए हों, जिससे मुझे विश्वास हो कि मैं केकपीएचपी 3 में गलत कर रहा था इसलिए मैंने इसे बदल दिया। कोई विचार यह क्यों है कि यह त्रुटि दे रहा है? – Wisd0m

+0

@ Wisd0m प्लगइन में आपके उपयोगकर्ता मॉडल है? – drmonkeyninja

+0

कोई मेरा उपयोगकर्ता मॉडल प्लगइन में नहीं है। यह वास्तव में अजीब है कि यह मुझे उस त्रुटि दे रहा है, क्या उपयोगकर्ताओं के पास कुछ ('संदेश') संबंध हो सकता है? – Wisd0m

2

आप आपकी मदद @drmonkeyninja के लिए धन्यवाद -:

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

MessagesTable

$this->belongsTo('Sender', [ 
    'className' => 'Users', 
    'foreignKey' => 'sender_id', 
    'propertyName' => 'Sender', 
]); 
$this->belongsTo('Receiver', [ 
    'className' => 'Users', 
    'foreignKey' => 'user_id', 
    'propertyName' => 'Receiver' 
]); 

क्वेरी जो काम करता है:

$messages = $this->Messages->find() 
     ->where(['Messages.user_id' => $this->Auth->user('id')]) 
     ->orwhere(['Messages.sender_id' => $this->Auth->user('id')]) 
     ->order(['Messages.created' => 'DESC']) 
     ->contain([ 
      'Sender', 
      'Receiver' 
     ]) 
    ;