尝试加载用户在" 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']
]);
答案 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();
或变量 与参数同名。
<强>更新强>
添加到用户表
$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();
注意:我没有使用您在模型中定义的任何belongsToMany
,belongsTo
关系
我希望这能解决你的问题。