2015-05-19 7 views
17

Kann jemand mich in die richtige Richtung zeigen, um eine "Benutzer folgt" Art der Sache zu tun. Ich habe 3 Tabellen: Benutzer, user_follows und eine Posts."Benutzer folgt" mit PropelORM - Drei-Wege-Beziehung

Wenn ich ein Benutzerobjekt hydratiere, kann ich eine Reihe von Benutzer-IDs bekommen sie folgen ... und ein Post-Objekt weiß, welcher Benutzer es gepostet ... aber kämpfen Posts nur für die Benutzer, denen ein bestimmter Benutzer folgt .

Derzeit haben diese, die Beiträge von allen zurückgibt.

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

Need filterByXXX() zu tun ...

+1

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

+0

mir auf jeden Fall geholfen aus. Wies mich in die richtige Richtung, danke! –

Antwort

1

Propel ORM many-to-many-Beziehung zwischen Einheiten der gleichen Tabelle nicht unterstützt. Aber Sie können EqualNestBehavior verwenden, um es zum Laufen zu bringen.

Mit diesem Code könnte wie folgt aussehen:

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

$follows = $user->getFollows(); 

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

Und hier ist der relevante Teil des Schemas:

<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

Diese leicht mit use*Query erfolgt.

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

optimierte Abfrage ist addJoinCondition zu verwenden:

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