cakephp 用户 ID 和相关模型

Posted

技术标签:

【中文标题】cakephp 用户 ID 和相关模型【英文标题】:cakephp userid and associated models 【发布时间】:2015-09-02 19:52:55 【问题描述】:

我需要匹配用户 id 上的关联模型,我认为下面的代码可以工作,因为我确实得到了 ArticleUseruser_id,但它没有给我我需要的 FavoriteArticle

对于FavoriteArticle 模型,数据返回为null,是的,数据库中有一个favorite_articles 表。

public $hasOne = array(
    'ArticleUser',
    'FavoriteArticle' => array(
        'className' => 'FavoriteArticle',
        'conditions' => array(
            'FavoriteArticle.user_id' => 'ArticleUser.user_id'
        ),
        'dependent' => true
    ) 
);

【问题讨论】:

两个问题: 1. 你用的是什么版本的Cakephp? 2. 可以使用$this->ArticleUsers->FavoriteArticles->find('all', array('conditions' => array('user_id' => X)));从ArticleUsersController中获取FavoriteArticle吗? @LarsEbert 它是 2.6.1 版,我没有使用 ArticleUsersController,因为 Article 模型有一个 ArticleUser。所有逻辑都在 ArticlesController 中。我还希望有某种方法可以将当前的 userId 传递给关联属性,但似乎没有办法不将模型绑定到控制器中。 那么你可以使用$this->Article->ArticleUsers->FavoriteArticles->find('all', array('conditions' => array('user_id' => X)));从ArticleController访问FavoriteArticle吗? @LarsEbert 以这种方式进行查找时出现错误。此外,如果文章有收藏夹,此逻辑只会获取文章,如果文章没有收藏夹怎么办?我需要Articles 和FavoriteArticles,我知道我可以做一个AND 或一个OR 运算符,但希望我可以通过模型在运行时得到这个,而不必在操作中构建查询。顺便说一句,如果用户有喜欢的文章,我使用了一个单独的函数来处理。 在ArticlesController 中使用$this->Articles->ArticleUsers->FavoriteArticles->find 相当于在FavoriteArticlesController 中使用$this->FavoriteArticles->find。因此,如果您可以运行一个非常简单的查询(仅在 FavoriteArticlesController 中运行 find('all') 而不是来自 ArticlesController,则关联不起作用。另外:您遇到什么错误? 【参考方案1】:

看看你执行的sql。

条件数组总是被转义

当一个条件被定义为一个数组时,CakePHP 假定键是“安全的”并且值是用户输入的,数组值总是被转义的。这里的意思是这段代码:

public $hasOne = array(
    'ArticleUser',
    'FavoriteArticle' => array(
        'conditions' => array(
            'FavoriteArticle.user_id' => 'ArticleUser.user_id' # <-
        ),
        'dependent' => true
    ) 
);

使用这样的查找调用:

$stuff = $articles->find('all', [
    'contain' => [
       'ArticleUser',
       'FavoriteArticle'
    ]
]);

会生成相当于:

的sql
SELECT 
    *
FROM 
    articles
LEFT JOIN
    article_user ON (
        favorite_articles.article_user_id = article_user.id
    )
LEFT JOIN
    favorite_articles ON (
        favorite_articles.articles_id = articles.id AND
        favorite_articles.user_id = 'ArticleUser.user_id' # <-
    )

请注意,连接条件是将user_id字符串

进行比较

如何比较两个字段值

要比较两个字段值,请使用 sql 片段:

public $hasOne = array(
    'ArticleUser',
    'FavoriteArticle' => array(
        'conditions' => array(
            'FavoriteArticle.user_id = ArticleUser.user_id'
                                    ^ ^ no quotes
        ),
        'dependent' => true
    ) 
);

生成的sql相当于:

SELECT 
    *
FROM 
    articles
LEFT JOIN
    article_user ON (
        favorite_articles.article_user_id = article_user.id
    )
LEFT JOIN
    favorite_articles ON (
        favorite_articles.articles_id = articles.id AND
        favorite_articles.user_id = articles_users.user_id # <-
    )

【讨论】:

这对我不起作用。在 favoriteArticles 属性中仍然有空值。无论如何都走了一条不同的路线,但是TY。 Take a look at your executed sql. - 您还没有将此添加到问题中。添加 为您提供所需数据的 sql 也会有所帮助。

以上是关于cakephp 用户 ID 和相关模型的主要内容,如果未能解决你的问题,请参考以下文章

cakephp 2 上的自动完成 Ajax

CakePHP 查找相关模型数据

php [cakephp:UserstampBehavior]在保存之前将用户的id创建/修改为实体的模型行为。 #cakephp

cakePHP 权限使用 ACL 并检查模型上的 user_id

cakephp 中的正确模型关联

CakePHP 表单选择值作为 table.id,选择选项文本作为 table.textfield