Подтвердить что ты не робот

"Пользователь следует" с PropelORM - трехсторонние отношения

Может ли кто-нибудь указать мне в правильном направлении, чтобы "пользователь следовал". У меня есть 3 таблицы: пользователи, user_follows и сообщения.

Если я увлажняю пользовательский объект, я могу получить массив идентификаторов пользователей, которым они следуют... и объект сообщения знает, какой пользователь его разместил... но изо всех сил пытается получить сообщения только для пользователей, которых следует данному пользователю.

В настоящее время есть это, что возвращает сообщения от всех.

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

Нужно делать filterByXXX()...

4b9b3361

Ответ 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)