2015-08-22 19 views
6

Yani, User modeli ve Item modeli var. Çoktan çoğa bir ilişki: Bir öğe birçok kullanıcıya ait olabilir ve bir kullanıcı birçok öğeye sahip olabilir. Bu nedenle, UserItemRel modeli var. En çok tercih edilen ürünler başka bir masadan nasıl edinilir?

Özetlemek gerekirse:

item 
id 
name 
date_created 
date_updated 

user 
id 
email 
password 
date_created 
date_updated 

user_item_rel 
user_id 
item_id 
date_created 

Benim sorgu, Yii2 geçiş yapmadan önce, bu oldu: Ben modellerini üretmek için yii2-enhanced-gii uzantısını kullandım

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 

.

Son 48 saatte en çok tercih edilen 20 öğeyi sayımlarıyla göstermek istiyorum. Yii1.1'den taşınıyorum ve şu ana kadar oldukça yoldaydım ve bunu anlayamıyorum.

Ben

$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]); 
        }); 
} 

buldum ama nasıl düzgün kullanmak için?

cevap

5

Sorgu, feryat gibi bir şey olurdu. Bunun, orm ile nasıl halledilebileceğini öğrenmeye çalışmak yerine yerel bir sorguyu çalıştırmayı denerdim.

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

Böyle bir şey denemek mümkün olabilir:

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 
      ) 

    ) 

) 
: Benim onu ​​test olarak

$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(); 

bana böyle bir şey verir

İlgili konular