Мне удалось решить эту проблему, спасибо @Cobby за объяснение сущности для таблицы соединений.
Я все еще новичок в Doctrine, так что, конечно, этот код можно улучшить, но это то, что у меня есть до сих пор, и я надеюсь, что оно кому-нибудь пригодится.
Репозиторий пользователей:
<?php
class UserRepository extends EntityRepository {
public function getFriends( \Entity\User $user, $status = Friends::STATUS_ACCEPTED )
{
return $this->getEntityManager()->createQuery( 'SELECT f FROM Entities\Friends f WHERE f.user = ?0 AND f.status = ?1' )
->setParameters( array( $user->getId(), 2 => $status ) )
->getResult();
}
}
Дружба сущность:
<?php
/**
* Friend Entity
*
* @Entity
* @Table(
* name="friendship",
* uniqueConstraints={
* @UniqueConstraint(name="UNIQ_FRIENDSHIP", columns={"user_id", "friend_id"})
* }
* )
*/
class Friendship
{
const STATUS_REQUESTED = 0;
const STATUS_ACCEPTED = 1;
const STATUS_REJECTED = -1;
const STATUS_BLOCKED = -2;
const STATUS_IGNORED = -3;
/**
* @Id @Column(type="integer")
* @GeneratedValue
*/
private $id;
/** @Column(type="integer") */
private $status;
/**
* @ManyToOne(targetEntity="User", inversedBy="userFriends")
*/
private $user;
/**
* @ManyToOne(targetEntity="User")
*/
private $friend;
/* ... */
Метод внутри некоторого класса обслуживания:
/**
* Creates a friendship between two users
* @param User $user
* @param User $friend
* @param integer $status
*
* @return Friends
*/
public function createOrUpdateFriendship( User $user, User $friend, $status )
{
//friendshipt already exists?
$friendship = $this->getRepository( 'Friends' )->findOneBy(array(
'user' => $user->getId(),
'friend' => $friend->getId()
));
if( $friendship ) {
$friendship->setStatus($status);
} else {
$entityManager = $this->getEntityManager();
$friendship = new Friends( $user, $friend, $status );
$entityManager->persist( $friendship );
$entityManager->flush();
}
return $friendship;
}
/* */