Yii与其他表的条件关系记录

我有一个类似于以下的关系记录:

  • 有用户(表用户)与ID
  • 有id,名称的类别(表格类别)
  • 有id,body,category_id的文章(表格文章)
  • 然后是一个带有article_id,user_id的read_articles表
  • 因此用户可以看到一个类别中所有文章的列表。 他们可以点击一篇文章,它会在read_articles表中添加一个条目(user_id,article_id)。

    我希望能够使用Yii的ActiveRecord获取当前用户尚未读取的给定类别中的所有文章并显示这些文章。 我一直在用SQL来思考它,但我不确定如何将它适用于我的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中谈论的? 或者我应该考虑转向更简单的SQL并自己处理这样的事情(但是会失去很多AR的优点)?

    编辑这里是上述模型的关系:(免责声明,这些仅被截断为相关部分)

    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”,但是我从来没有使用过这个模型,它几乎是空的。

    坦率地说,我一直在考虑转向Symfony2和Doctrine,只是放弃主动记录。 我知道这并不能解决这个问题,但我可能会放弃这一点,并暂时保留当前的解决方案。


    要获取已阅读的文章,您可以在您的用户模型中定义MANY_MANY关系,如下所述:

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

    我不认为你需要代理模型UserReadArticles,你只需要正确定义关系。

    为了获得未读文章,我在思考Yii方法时也遇到了困难,但比使用子选择查询更有效的方法是对user_read_articles执行LEFT JOIN并检查user_read_articles的列是否为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',
    ) );
    
    链接地址: http://www.djcxy.com/p/56909.html

    上一篇: Yii Relational record with condition from other table

    下一篇: Determine which aspects hook into a given class