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

时间:2017-05-24 18:28:09

标签: php mysql database cakephp cakephp-3.0

尝试加载用户在" Cakey"办法。

三张桌子:

用户(ID,用户名,密码)

帖子(id,text,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']
  ]);

2 个答案:

答案 0 :(得分:0)

您错过了继承$user_id的{​​{1}}。

matching anonymous function
  

闭包也可以从父作用域继承变量。任何这样的   必须将变量传递给use语言构造。从PHP 7.1起,   这些变量不得包含superglobals$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(); 或变量   与参数同名。

另见Anonymous functions

  

<强>更新

添加到用户表

$this

控制器

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

答案 1 :(得分: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关系

我希望这能解决你的问题。