添加具有Doctrine的朋友时更改status列的值

时间:2011-04-15 23:59:27

标签: php many-to-many doctrine-orm

我现在开始使用Doctrine 2和Zend Framework,我正在创建一个用户之间的友谊系统。 在我的数据库的朋友表中,我有以下列:

User_id | Friend_id | Status

其中status是一个可以是-1,0或1的数字。

我正在使用关系多对多,更具体地说,与Doctrine文档中显示的相同:http://www.doctrine-project.org/docs/orm/2.0/en/reference/association-mapping.html#many-to-many-self-referencing

但是我(遗憾的是)不知道如何修改表朋友的状态列的值。 :(

如何进行?

编辑:状态列在friends表中,而不在users表中。

3 个答案:

答案 0 :(得分:1)

在这种情况下,您需要手动创建连接表作为实体:

<?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;
    }

}

......对于你可能会考虑的事情,这是一个粗略的指南。

答案 1 :(得分:0)

class User
{
    private $status;

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

将此添加到您的用户实体

答案 2 :(得分:0)

我已经设法解决了这个问题,感谢@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;
}

/* */