2015-05-19 16 views
17

Qualcuno può indicarmi la giusta direzione per fare un "utente segue" il genere di cose. Ho 3 tabelle: utenti, user_follows e un post."Utente segue" con PropelORM - Relazione a tre vie

Se idraggio un oggetto utente, posso ottenere una matrice di id degli utenti che seguono ... e un oggetto post sa quale utente l'ha pubblicato ... ma fatica a ottenere post solo per gli utenti seguiti da un determinato utente .

Attualmente hanno questo, che restituisce messaggi da tutti.

$posts = PostsQuery::create() 
     ->orderByDate('desc') 
     ->limit('12') 
     ->find(); 
    return $posts; 

devi fare filterByXXX() ...

+1

provare questo: https://groups.google.com/forum/#!topic/propel-development/UG-7T3dK2Wg –

+0

Sicuramente mi ha aiutato su. Mi ha indirizzato nella giusta direzione, grazie! –

risposta

1

Propel non supporta molti-a-molti tra entità dello stesso tavolo. Ma puoi usare EqualNestBehavior per farlo funzionare.

Con questo il codice potrebbe essere la seguente:

$user = UsersQuery::create()->findPk($userId); 

$follows = $user->getFollows(); 

$posts = PostsQuery::create() 
     ->filterByUser($follows) 
     ->orderByDate('desc') 
     ->limit('12') 
     ->find(); 

E qui è la parte rilevante dello schema:

<table name="follow"> 
    <behavior name="equal_nest"> 
    <parameter name="parent_table" value="users" /> 
    </behavior> 
    <!-- you do not need to specify any colums for the "follow" table, the behavior will add them automatically --> 
</table> 
1

Questo è fatto facilmente utilizzando use*Query.

$posts = PostsQuery::create() 
    ->useUserFollowsQuery() 
     ->filterByUserId([12,34,55]) 
    ->endUse() 
    ->orderByDate('desc') 
    ->limit('12') 
    ->groupById() //important if you join a one-to-many relation 
    ->find(); 
return $posts; 

Query ottimizzato è quello di utilizzare addJoinCondition:

->innerJoinUserFollows() 
->addJoinCondition('UserFollows', 'UserFollows.user_id = ?',[123,34], Criteria::IN)