"Пользователь следует" с PropelORM - трехсторонние отношения
Может ли кто-нибудь указать мне в правильном направлении, чтобы "пользователь следовал". У меня есть 3 таблицы: пользователи, user_follows и сообщения.
Если я увлажняю пользовательский объект, я могу получить массив идентификаторов пользователей, которым они следуют... и объект сообщения знает, какой пользователь его разместил... но изо всех сил пытается получить сообщения только для пользователей, которых следует данному пользователю.
В настоящее время есть это, что возвращает сообщения от всех.
$posts = PostsQuery::create()
->orderByDate('desc')
->limit('12')
->find();
return $posts;
Нужно делать filterByXXX()...
Ответы
Ответ 1
Propel ORM не поддерживает отношения "многие ко многим" между объектами одной и той же таблицы. Но вы можете использовать EqualNestBehavior, чтобы заставить его работать.
С этим ваш код может выглядеть так:
$user = UsersQuery::create()->findPk($userId);
$follows = $user->getFollows();
$posts = PostsQuery::create()
->filterByUser($follows)
->orderByDate('desc')
->limit('12')
->find();
И вот соответствующая часть схемы:
<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>
Ответ 2
Это легко сделать с помощью 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;
Оптимизация запросов - использование addJoinCondition:
->innerJoinUserFollows()
->addJoinCondition('UserFollows', 'UserFollows.user_id = ?',[123,34], Criteria::IN)