php - simple - spot orm
"El usuario sigue" con PropelORM-Relación de tres vías (2)
¿Alguien puede señalarme en la dirección correcta para hacer un tipo de cosas que el "usuario sigue"? Tengo 3 tablas: usuarios, user_follows y una publicación.
Si hidrato un objeto de usuario, puedo obtener una serie de ID de usuarios que siguen ... y un objeto de publicación sabe qué usuario lo publicó ... pero luchando por obtener publicaciones solo para los usuarios que sigue un usuario determinado.
Actualmente tenemos esto, que devuelve publicaciones de todos.
$posts = PostsQuery::create()
->orderByDate(''desc'')
->limit(''12'')
->find();
return $posts;
Necesito hacer filterByXXX () ...
Esto se hace fácilmente usando 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;
La consulta optimizada es usar addJoinCondition:
->innerJoinUserFollows()
->addJoinCondition(''UserFollows'', ''UserFollows.user_id = ?'',[123,34], Criteria::IN)
Propel ORM no admite la relación de muchos a muchos entre entidades de la misma tabla. Pero puedes usar EqualNestBehavior para que funcione.
Con esto tu código podría verse así:
$user = UsersQuery::create()->findPk($userId);
$follows = $user->getFollows();
$posts = PostsQuery::create()
->filterByUser($follows)
->orderByDate(''desc'')
->limit(''12'')
->find();
Y aquí está la parte relevante del esquema:
<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>