CakePHP 3 - 加载用户关注的用户的帖子
Posted
技术标签:
【中文标题】CakePHP 3 - 加载用户关注的用户的帖子【英文标题】:CakePHP 3 - Load posts from users a user is following 【发布时间】:2017-10-25 06:00:37 【问题描述】:尝试加载用户以“蛋糕”方式关注的用户的所有帖子。
三个表:
用户(ID、用户名、密码)
帖子(id、文本、user_id、已创建)
关注(id、user_id、following_id)
我认为我的关系设置正确,所以我可以加载用户关注者和关注他们的人:
用户表
$this->belongsToMany('Following', [
'className' => 'Users',
'foreignKey' => 'user_id',
'targetForeignKey' => 'following_id',
'joinTable' => 'follows'
]);
$this->belongsToMany('Followers', [
'className' => 'Users',
'foreignKey' => 'following_id',
'targetForeignKey' => 'user_id',
'joinTable' => 'follows'
]);
跟随表格
$this->belongsTo('Users', [
'foreignKey' => 'user_id',
'joinType' => 'INNER'
]);
帖子表
$this->belongsTo('Users', [
'foreignKey' => 'user_id',
'joinType' => 'INNER'
]);
现在正在努力从单个用户关注的用户中选择所有帖子。认为我需要使用此处记录的matching()
方法:Filtering by Associated Data Via Matching And Joins,但似乎没有做对。
尝试以下方式:
$user_id = $this->Auth->user('id');
$posts = $this->Posts->find()->matching('Users.Following', function ($q) use ($user_id)
return $q->where(['Users.id' => $user_id]);
)->all();
更新:
我认为我的关系设置正确,此查找将返回用户以及他们关注的所有用户:
$users = $this->Posts->Users->get(1, [
'contain' => ['Following']
]);
【问题讨论】:
把你的 find() 查询放在这里 已添加到问题中。我想我走的是正确的路线...... 你得到了什么结果? 请在您的问题中分别添加三个表关系。你添加了一个,但你没有告诉他们属于哪个表 我已经添加了我的关系详情 【参考方案1】:您错过了将$user_id
继承给matching anonymous function
。
$user_id = $this->Auth->user('id');
$posts = $this->Posts->find()
->matching('Users.Following', function ($q) use ($user_id)
return $q->where(['Users.id' => $user_id]);
)
->all();
闭包也可以从父作用域继承变量。任何此类 变量必须传递给使用语言构造。从 php 7.1 开始, 这些变量不得包括 superglobals、
$this
或变量 与参数同名。
另见Anonymous functions
更新:
添加到用户表
$this->hasMany('Posts', [
'className' => 'Posts',
'foreignKey' => 'user_id'
]);
控制器
$users = $this->Posts->Users->get(1, [
'contain' => ['Following.Posts']
]);
【讨论】:
是的,这是缺少的一件事,但我仍然没有仅从该用户关注的用户那里获取帖子,我正在获取所有帖子 我想说还有更多问题,Users
是条件的错误别名,并且可能应该针对 Followers
而不是 Following
进行匹配,否则它会检索 AFAICT用户$user_id
的关注者的帖子,而不是用户$user_id
关注的用户的帖子。
我在我的问题中添加了一个示例查询,该查询返回用户关注的用户,所以我认为关系是正确的1
@RayannNayran 感谢您的帮助。这种方法总是有效的,但不是我所追求的。这将返回一个用户实体数组,该数组又包含该用户帖子的数组。理想情况下,我只需要一组帖子实体,其中包含用户关注的用户的帖子。
我确定我需要使用匹配函数book.cakephp.org/3.0/en/orm/…【参考方案2】:
正如您在评论中提到的那样'理想情况下,我只想要一组帖子实体,其中包含用户关注的用户的帖子。' 具有适当连接条件的简单查找查询应该可以完成工作:
$user_id = $this->Auth->user('id');
$this->loadModel("Posts");
$posts = $this->Posts->find('all')
->select()
->where(["users.id" => $user_id])
->join([
'follows' => [
'table' => 'Follows',
'type' => 'LEFT',
'conditions' => 'follows.following_id = Posts.user_id'
],
'users' => [
'table' => 'Users',
'type' => 'LEFT',
'conditions' => 'users.id = follows.user_id'
]
]);
$posts->toArray();
注意:我没有使用您在模型中定义的任何belongsToMany
,belongsTo
关系
希望这能解决你的问题。
【讨论】:
以上是关于CakePHP 3 - 加载用户关注的用户的帖子的主要内容,如果未能解决你的问题,请参考以下文章