cakephp 用户 ID 和相关模型
Posted
技术标签:
【中文标题】cakephp 用户 ID 和相关模型【英文标题】:cakephp userid and associated models 【发布时间】:2015-09-02 19:52:55 【问题描述】:我需要匹配用户 id 上的关联模型,我认为下面的代码可以工作,因为我确实得到了 ArticleUser
的 user_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'
]
]);
会生成相当于:
的sqlSELECT
*
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 和相关模型的主要内容,如果未能解决你的问题,请参考以下文章
php [cakephp:UserstampBehavior]在保存之前将用户的id创建/修改为实体的模型行为。 #cakephp