2017-05-24 36 views
5

嘗試加載用戶以「Cakey」方式關注的所有帖子。CakePHP 3 - 加載用戶正在關注的用戶的帖子

三個表:

用戶(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(); 

UPDATE:

我想我有我的關係設置正確,這個發現將返回用戶,以及所有的用戶如下:

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

將您的find()查詢放在這裏 –

+0

已添加到問題中。我想我正沿着正確的路線走...... –

+0

你得到的結果是什麼? –

回答

0

您錯過了將$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

UPDATE:

添加到用戶表

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

控制器

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

是的,這是一個缺少的東西,但我仍然沒有從那個用戶關注的用戶那裏獲得帖子, m得到所有帖子 –

+0

我想說還有更多的問題,'用戶'是這個條件的錯誤別名,匹配應該可以針對'追隨者'而不是'追隨'完成,AFAICT否則會檢索帖子的用戶是'user_id'的用戶,而不是用戶'$ user_id'是追隨者的用戶的帖子。 – ndm

+0

我已經添加到我的問題的示例查詢,返回用戶所關注的用戶,所以我認爲這種關係是正確的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關係的問題。

相關問題