2015-04-18 5 views
7

मेरे पास निम्नलिखित डीबी टेबल हैं: आइटम, उपयोगकर्ता, समूह, आइटम इमेज। (आइटम, समूह) और (उपयोगकर्ता, समूह), और वस्तुओं (आइटम, आइटम) के बीच कई लोगों के बीच कई संबंध हैं। केकपीएचपी में एसोसिएशन के रूप में सभी उचित विदेशी कुंजी स्थापित की गई हैं।केकपीएचपी 3 में चयनित फ़ील्ड हैं

मैं() के साथ एक क्वेरी कैसे बना सकता हूं जिसमें सभी आइटम और उनकी मुख्य छवि का चयन किया जाता है, जो एक समूह में हैं जो एक विशेष आईडी वाले उपयोगकर्ता को मुख्य समूह के रूप में असाइन किया गया है?

SELECT items.id AS itemId, items.name, itemImages.url AS itemUrl 
FROM items 
INNER JOIN groups_items ON groups_items.item_id = items.id 
INNER JOIN groups ON groups_images.group_id = groups.id 
INNER JOIN groups_users ON groups_users.group_id = groups.id 
INNER JOIN users ON groups_users.user_id = users.id 
INNER JOIN itemImages ON itemImages.item_id = items.id 
WHERE groups_users.isMainGroup = 1 
    AND users.id = :userId 
    AND itemImages.isMainImage = 1 

CakePHP कोड मैं अब के लिए है:

$items = $this->Items->find() 
      ->hydrate(false) 
      ->contain([ 
       'Groups.Users' => function($q) use ($userId){ 
        return $q->where(['isMainGroup' => 1, 'Users.id' => $userId]); 
       }, 
       'ItemImages' => function($q){ 
        return $q->where(['isMainImage' => 1]); 
       }, 
      ]); 
      //->select(['itemId' => 'Items.id', 'Items.name', 'itemUrl' => 'itemImages.url']); 

उत्तर

9

मिलान() विधि के साथ मदद कर सकते हैं

यह स्पष्ट बनाने के लिए चाहते हैं कि सादे SQL क्वेरी कैसा दिखेगा है यह

$items = $this->Items->find() 
     ->hydrate(false) 
     ->select(['Items.id', 'Items.name', 'itemImages.url']) 
     ->distinct(['Items.id']) 
     ->matching('Groups.Users', function ($q) use ($userId) { 
      return $q->where(['Groups.isMainGroup' => 1, 'Users.id' => $userId]); 
     }) 
     ->matching('ItemImages', function ($q) { 
      return $q->where(['ItemImages.isMainImage' => 1]); 
     }) 
     ->contain([ 
      'ItemImages' => function ($q) { 
       return $q->autoFields(false) 
         ->select(['id','url']) 
         ->where(['ItemImages.isMainImage' => 1]); 
      } 
     ]); 

मुझे लगता है कि, इस मामले में, अंतिम con टैन स्टेटमेंट को ओमेट किया जा सकता है, क्योंकि वांछित परिणाम पहले से ही _matchingData संपत्ति में है।

नोट पर distict() stament:

इस समारोह एक अंदरूनी शामिल हों पैदा करेगा के रूप में, आप खोज क्वेरी पर अलग बुला विचार करने के लिए के रूप में आप अगर अपनी शर्तों डुप्लीकेट पंक्तियों मिल सकता है चाहते हो सकता है उन्हें पहले से ही फिल्टर नहीं

http://book.cakephp.org/3.0/en/orm/retrieving-data-and-resultsets.html#filtering-by-associated-data

+0

हाँ, पिछले की जरूरत नहीं था होते हैं - सभी डेटा alre गया था मेलिंग() फ़ंक्शंस से _matchingData में ady। मेरा बड़ा सवाल यह था कि परिणाम को "फ़्लैट" कैसे करें। जब मैं() की तरह चयन करता हूं, तो यह मुझे "_matchingData" कुंजी के तहत उपरोक्त के रूप में यूआरएल देता है, और मैं इसे अन्य मानों के समान स्तर पर रखना चाहता हूं। मैंने वर्कअराउंड के रूप में क्या किया था json_encode -> सभी "_matchingData" को हटा दें। स्ट्रिंग घटनाएं -> json_decode। – user1507558

+0

'विशिष्ट 'कथन पर टिप्पणी बहुत उपयोगी है। –

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