Изменить значение столбца статуса при добавлении друга в Doctrine - PullRequest
1 голос
/ 16 апреля 2011

Я начинаю сейчас с Doctrine 2 и Zend Framework и создаю систему дружбы среди пользователей. В таблице Друзья моей базы данных у меня есть следующие столбцы:

User_id | Friend_id | Status

Где статус - это число, которое может быть -1, 0 или 1.

Я использую отношение многие-ко-многим , точнее, то же, что показано в документации к Doctrine: http://www.doctrine -project.org / docs / orm / 2.0 / ан / ссылки / ассоциации-mapping.html # многие-ко-многим-автореферентное

Но я (к сожалению) не знаю, как изменить значение столбца статуса таблицы друзей. (

Как поступить?

РЕДАКТИРОВАТЬ: столбец состояния находится внутри таблицы друзей, а не в таблице пользователей.

Ответы [ 3 ]

1 голос
/ 16 апреля 2011

В этом случае вам нужно вручную создать объединяющую таблицу как сущность:

<?php

/**
 * @Entity
 */
class UserFriend
{   

    const STATUS_NORMAL = 1;
    const STATUS_BANNED = 2;
    const STATUS_ANOTHER_STATUS = 4;

    /**
     * @ManyToOne(targetEntity="User", inversedBy="userFriends")
     */
    private $user;

    /**
     * @ManyToOne(targetEntity="User")
     */
    private $friend;

    /**
     * @Column(type="integer");
     */
    private $status = self::STATUS_NORNAL;

    public function __construct(User $user, User $friend, $status)
    {
        $this->setUser($user);
        $this->setFriend($friend);
        $this->setStatus($status);
    }

    // ... getters and setters


}

/**
 * @Entity
 */
class User
{

    /**
     * @OneToMany(targetEntity="UserFriend", mappedBy="user")
     */
    private $userFriends;

    public function __construct()
    {
        $this->userFriends = new ArrayCollection();
    }

    public function addFriend(User $friend, $status)
    {
        $this->userFriends->add(new UserFriend($this, $friend, $status));
    }

    public function getFriends()
    {
        $friends = array();
        foreach($this->userFriends as $userFriend){
            $friends[] = $userFriend->getFriend();
        }

        return $friends;
    }

}

... Это грубое руководство к тому, что вы могли бы рассмотреть.

0 голосов
/ 21 апреля 2011

Мне удалось решить эту проблему, спасибо @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;
}

/* */
0 голосов
/ 16 апреля 2011
class User
{
    private $status;

    public function setStatus($status) {
         $this->status = $status;
         return $this;
    }
}

добавить это в свой пользовательский объект

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...