gpt4 book ai didi

php - Yii 关系记录与来自其他表的条件

转载 作者:可可西里 更新时间:2023-11-01 12:57:05 24 4
gpt4 key购买 nike

我有一条类似如下的关系记录:

  • 有用户(表用户)有id
  • 有id、name的类别(表类别)
  • 有id、body、category_id的文章(表格文章)
  • 然后有一个表read_articles 有article_id, user_id

因此用户可以看到一个类别中所有文章的列表。他们可以点击一篇文章,它会在 read_articles 表中添加一个条目 (user_id, article_id)。

我希望能够使用 Yii 的 ActiveRecord 获取给定类别中当前用户尚未阅读的所有文章并显示这些文章。我一直在从 SQL 的角度考虑它,但我不确定如何将它放入我的 ActiveRecord 设置中。我的第一个想法是 Article 事件记录的参数化范围:

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 的很多不错的功能)?

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

用户事件记录

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' ),
);
}

用户类别事件记录

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' ),
);
}

文章事件记录

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',
) );

关于php - Yii 关系记录与来自其他表的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8682674/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com