CakePHP 3 - 加载用户关注者的帖子

5
尝试以"Cakey"方式加载用户关注的所有帖子。
三个表: users(id,用户名,密码) posts(id,文本,user_id,created) follows(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()方法:通过匹配和连接筛选关联数据,但似乎没有做对。 尝试以下内容:
$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()查询。 - Rayann Nayran
已添加到问题中。我认为我正在沿着正确的方向前进... - Kyle Goslan
你得到了什么结果? - Rayann Nayran
请在您的问题中单独添加三个表之间的关系。您已经添加了一个,但没有说明它们属于哪个表。 - Rayann Nayran
我已经添加了我的关系细节。 - Kyle Goslan
2个回答

0

正如您在评论中提到的那样“理想情况下,我只想要一个帖子实体数组,其中包括用户正在关注的用户的帖子。” 使用适当的连接条件进行简单的查找查询即可完成工作:

 $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();

注意:我没有在模型中使用你定义的belongsToManybelongsTo关系。

希望这能解决你的问题。


0

你忘记在匿名函数中继承$user_id

$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();
闭包也可以从父级作用域继承变量。这些变量必须传递给use语言结构。从PHP 7.1开始,这些变量不得包括超全局变量$this或与参数同名的变量。

另请参见匿名函数

更新:

添加到用户表中

$this->hasMany('Posts', [
   'className' => 'Posts',
   'foreignKey' => 'user_id'
]);

控制器

$users = $this->Posts->Users->get(1, [
    'contain' => ['Following.Posts']
]);

是的,这是一个缺失的部分,但我仍然没有只获取该用户关注的用户的帖子,而是获取了所有帖子。 - Kyle Goslan
我认为还有更多的问题,Users 是条件的错误别名,匹配可能应该针对 Followers 而不是 Following 进行。据我所知,否则它将检索用户 $user_id 的关注者的帖子,而不是用户 $user_id 是关注者的用户的帖子。 - ndm
我在我的问题中添加了一个查询示例,该查询返回用户正在关注的用户,因此我认为关系是正确的。 - Kyle Goslan
@RayannNayran 感谢您的帮助。那种方法总是有效的,但不完全符合我的要求。它返回一个用户实体数组,其中又包含该用户的帖子数组。理想情况下,我只想要一个由所关注用户的帖子实体组成的帖子实体数组。 - Kyle Goslan
我确定我需要使用匹配函数做些什么 https://book.cakephp.org/3.0/en/orm/retrieving-data-and-resultsets.html#filtering-by-associated-data-via-matching-and-joins - Kyle Goslan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接