2011-12-30 10 views
7

से शर्त के साथ Yii संबंधपरक रिकॉर्ड मैं निम्न के समान एक संबंधपरक रिकॉर्ड है:अन्य तालिका

  • आईडी वाले प्रयोक्ता (टेबल उपयोगकर्ताओं) कर रहे हैं
  • वहाँ आईडी, नाम के साथ श्रेणियों (तालिका श्रेणियों) कर रहे हैं
  • वहाँ, आईडी, शरीर के साथ लेख (तालिका लेख) कर रहे हैं category_id
  • तो फिर वहाँ है article_id के साथ एक मेज read_articles, user_id

तो कोई उपयोगकर्ता किसी श्रेणी में सभी लेखों की एक सूची देख सकता है। वे एक लेख पर क्लिक कर सकते हैं और यह read_articles तालिका में एक प्रविष्टि (user_id, article_id) जोड़ देगा।

मैं किसी दिए गए श्रेणी से सभी लेख प्राप्त करने के लिए Yii के ActiveRecord का उपयोग करने में सक्षम होना चाहता हूं जो वर्तमान उपयोगकर्ता द्वारा नहीं पढ़े गए हैं और उन्हें प्रदर्शित करते हैं। मैं एसक्यूएल के मामले में इसके बारे में सोच रहा हूं लेकिन मुझे यकीन नहीं है कि इसे मेरे ActiveRecord सेटअप में कैसे फिट किया जाए। मेरा पहला विचार अनुच्छेद सक्रिय रिकॉर्ड पर पैरामीटरयुक्त दायरा था:

public function unread($userId) 
{ 
    $this->getDbCriteria()->mergeWith(array(
     'alias' => 'articles', 
     'condition' => 'not exists (SELECT * ' 
      . 'FROM user_read_articles ' 
      . 'WHERE articles.id=user_read_articles.article_id ' 
      . 'AND read_articles.user_id=' . (int)$userId 
      . ')', 
    )); 
} 

ऐसा लगता है कि यह काम कर रहा है, लेकिन यह वास्तव में मेरे लिए गंदा लगता है।

क्या ActiveRecord में मैं जो बात कर रहा हूं उसे करने का एक क्लीनर तरीका है? या क्या मुझे शायद अधिक सादे एसक्यूएल की तरफ बढ़ने और इस तरह की चीज़ों को संभालने पर विचार करना चाहिए (लेकिन एआर की बहुत अच्छी सुविधा खोना)?

संपादित यहाँ उपर्युक्त मॉडल के लिए संबंधों हैं: (अस्वीकरण, ये केवल प्रासंगिक भागों तक छोटा कर दिया जाता है)

UserActiveRecord

public function relations() 
{ 
    return array(
     'categories' => array(
      self::HAS_MANY, 
      'UserCategoryActiveRecord', 
      'user_id'), 
     // I added this early using gii, never really used it... 
     'readArticles' => array(
      self::HAS_MANY, 
      'UserReadArticleActiveRecord', 
      'user_id'), 
    ); 
} 

UserCategoryActiveRecord

public function relations() 
{ 
    return array(
     'user' => array(
      self::BELONGS_TO, 
      'UserActiveRecord', 
      'user_id'), 
     'articles' => array(
      self::HAS_MANY, 
      'ArticleActiveRecord', 
      'category_id', 
      'order' => 'articles.pub_date DESC'), 
    ); 
} 

ArticleActiveRecord

public function relations() 
{ 
    return array(
     'category' => array(
      self::BELONGS_TO, 
      'CategoryActiveRecord', 
      'category_id'), 
    ); 
} 

मैंने इसे "UserReadArticleActiveRecord" भी बनाया है, क्योंकि मैं इसे बना रहा था, लेकिन मैंने कभी भी उस मॉडल का उपयोग नहीं किया और यह बहुत खाली है।

सभी ईमानदारी में, मैं सिम्फनी 2 और सिद्धांत को आगे बढ़ने और पूरी तरह सक्रिय रिकॉर्ड को पूरी तरह से हटाने की सोच रहा हूं। मुझे पता है कि यह इस समस्या को हल नहीं करता है, लेकिन मैं इसे छोड़ सकता हूं और समय के लिए अपना वर्तमान समाधान रख सकता हूं।

+0

क्या आपके पास आलेख से UserReadArticles में परिभाषित संबंध है? यदि ऐसा है, तो मुझे पूरा यकीन है कि आप अपने नामित दायरे में कहीं भी संबंध नाम शामिल कर सकते हैं। – lucifurious

+0

मैं UserReadArticles बना सकता हूं लेकिन मुझे यकीन नहीं है कि मुझे पता है कि इसे नामित क्षेत्र में कैसे फिट किया जाए। – Matt

+0

मुझे दिखाए गए संबंध दिखाएं –

उत्तर

4

को यहां बताए गए पढ़ लेख पाने के लिए आपको अपने प्रयोक्ता मॉडल पर एक MANY_MANY संबंधों को परिभाषित कर सकते हैं:

http://www.yiiframework.com/doc/guide/1.1/en/database.arr

मैं, नहीं लगता है कि आप प्रॉक्सी मॉडल UserReadArticles की आवश्यकता होगी कि आप बस रिश्ते को सही तरीके से परिभाषित करने की जरूरत है।

अपठित लेख, मैं भी मुसीबत Yii तरह से यह करने के लिए के बारे में सोच है, लेकिन एक उप चयन क्वेरी का उपयोग कर रहा है एक वाम करने के लिए की तुलना में एक अधिक कुशल तरीका हो रही है प्राप्त करने के लिए user_read_articles को शामिल हों और अगर एक जाँच user_read_articles से कॉलम IS NULL (कोई मिलान पंक्ति नहीं थी) इस तरह कुछ:

$this->getDbCriteria()->mergeWith(array(
    'alias' => 'articles', 
    'join' => 'LEFT JOIN user_read_articles ON articles.id=user_read_articles.article_id', 
    'condition' => 'user_read_articles.article_id IS NULL', 
)); 
संबंधित मुद्दे