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 - 加载用户关注的用户的帖子的主要内容,如果未能解决你的问题,请参考以下文章

迭代不返回所有值CakePhp

CakePHP 2.1 - 模型关联 - 保存和查找

CakePHP - 关系问题 - Posts.Child 属于用户,如何定义?

热门获取属于其他用户关注的用户的帖子

获取用户关注的个人资料的帖子

Firestore/Firebase - 为关注/关注用户帖子建模数据的方法