2015-08-22 18 views
6

तो, User मॉडल है, और Item मॉडल है। यह कई से अधिक संबंध है: एक आइटम कई उपयोगकर्ताओं से संबंधित हो सकता है, और उपयोगकर्ता के पास कई आइटम हो सकते हैं। इसलिए, UserItemRel मॉडल है।किसी अन्य तालिका से, सबसे पसंदीदा आइटम कैसे प्राप्त करें?

संक्षेप में:

item 
id 
name 
date_created 
date_updated 

user 
id 
email 
password 
date_created 
date_updated 

user_item_rel 
user_id 
item_id 
date_created 

मेरे क्वेरी, Yii2 करने के लिए स्विच करने से पहले, यह था:

SELECT COUNT(UIR.`user_id`) as `favourited`, IT.`id`, IT.`name`, CA.`name` as `category` 
    FROM `user_item_rel` UIR 
    LEFT JOIN `item` IT ON UIR.`item_id` = IT.`id` 
    LEFT JOIN `category_item` CI ON UIR.`item_id` = CI.`item_id` 
    LEFT JOIN `category` CA ON CI.`category_id` = CA.`id` 
    WHERE UIR.`date_created` >= (SYSDATE() - INTERVAL 3 YEAR) 
    GROUP BY UIR.`item_id` 
    ORDER BY 
     `favourited` DESC 
    LIMIT 20 

मैं yii2-enhanced-gii विस्तार का उपयोग किया है मॉडल उत्पन्न करने के लिए।

मैं पिछले 48 घंटों में 20 की सबसे पसंदीदा वस्तुओं को उनकी गणना के साथ दिखाना चाहता हूं। मैं Yii1.1 से माइग्रेट कर रहा हूं, और यह अब तक काफी सवारी कर रहा है, और मैं इसे समझ नहीं सकता।

मैं

$this->hasMany(UserItemRel::className(), ['id' => 'user_id']) 
        ->viaTable('user_item_rel', ['id' => 'item_id'], function ($query) { 
         $query->andWhere(['date_created < INTERVAL 2 DAY']) 
         ->orderBy(['COUNT(*)' => SORT_DESC]); 
        }); 
} 

पाया है लेकिन कैसे ठीक से इस उपयोग कैसे करें?

उत्तर

5

क्वेरी कुछ पसंद है। मैं ओआरएम के साथ यह कैसे किया जा सकता है यह जानने की कोशिश करने के बजाय मूल क्वेरी चलाने की कोशिश करता हूं।

SELECT item_id, item.name, count(*) favorite 
FROM user_item_rel 
LEFT JOIN user ON user.id = user_item_rel.user_id 
LEFT JOIN item ON item.id = user_item_rel.item_id 
WHERE user_item_rel.date_created >= (sysdate() - interval 2 DAY) 
GROUP BY item_id, name 
ORDER BY favorite DESC 
LIMIT 20 
2

आप कुछ इस तरह की कोशिश करने में सक्षम हो सकता है:

Array 
(
    [1] => Array 
    (
     [favourited] => 4 
     [item_id] => 1 
     [item] => Array 
      (
       [id] => 1 
       [name] => Donec 
       [date_created] => 2015-08-26 
       [date_updated] => 2015-08-26 
      ) 

    ) 

    [8] => Array 
    (
     [favourited] => 3 
     [item_id] => 8 
     [item] => Array 
      (
       [id] => 8 
       [name] => Tellus 
       [date_created] => 2015-08-26 
       [date_updated] => 2015-08-26 
      ) 

    ) 

    [7] => Array 
    (
     [favourited] => 2 
     [item_id] => 7 
     [item] => Array 
      (
       [id] => 7 
       [name] => Mollis 
       [date_created] => 2015-08-26 
       [date_updated] => 2015-08-26 
      ) 

    ) 

) 
:

$items = UserItemRel::find() 
    ->asArray() 
    ->select("COUNT(`user_id`) as favourited, `item_id`") 
    ->groupBy("item_id") 
    ->joinWith("item") 
    ->orderBy("favourited DESC") 
    ->indexBy("item_id") 
    ->where("'date_created' >= '".date("Y-m-d", strtotime("-2 days"))."'") 
    ->limit(3) 
    ->all(); 

मेरी यह परीक्षण में मुझे कुछ इस तरह देता है

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