से शर्त के साथ 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 और सिद्धांत को आगे बढ़ने और पूरी तरह सक्रिय रिकॉर्ड को पूरी तरह से हटाने की सोच रहा हूं। मुझे पता है कि यह इस समस्या को हल नहीं करता है, लेकिन मैं इसे छोड़ सकता हूं और समय के लिए अपना वर्तमान समाधान रख सकता हूं।
क्या आपके पास आलेख से UserReadArticles में परिभाषित संबंध है? यदि ऐसा है, तो मुझे पूरा यकीन है कि आप अपने नामित दायरे में कहीं भी संबंध नाम शामिल कर सकते हैं। – lucifurious
मैं UserReadArticles बना सकता हूं लेकिन मुझे यकीन नहीं है कि मुझे पता है कि इसे नामित क्षेत्र में कैसे फिट किया जाए। – Matt
मुझे दिखाए गए संबंध दिखाएं –