我现在开始使用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表中。
答案 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;
}
/* */