gpt4 book ai didi

php - Symfony2 自引用多对多关系

转载 作者:可可西里 更新时间:2023-11-01 01:02:34 25 4
gpt4 key购买 nike

我是 symfony2 的新手,我很难理解表格。

这个主题之前已经讨论过,但主要是关于关系方面的。我对表格以及如何管理关系的保存有疑问。一个用户的场景有很多用户 friend 。所以自引用多对多关系。

我正在使用 FOSUser Bundle 并且有一个友谊实体。这是用于创建实体的 YAML。

MH\FriendshipBundle\Entity\Friendship:
type: entity
table: mh_friendship
repositoryClass: MH\FriendshipBundle\Entity\FriendshipRepository
id:
id:
type: integer
generator:
strategy: AUTO
fields:
requested_at:
type: datetime
gedmo:
timestampable:
on: create
is_accepted:
type: boolean
nullable: true
accepted_at:
type: datetime
nullable: true
manyToOne:
user:
targetEntity: MH\UserBundle\Entity\User
inversedBy: user_friends
joinColumn:
name: user_id
referencedColumnName: id
friend:
targetEntity: MH\UserBundle\Entity\User
inversedBy: friend_users
joinColumn:
name: friend_id
referencedColumnName: id
lifecycleCallbacks:
prePersist: [ ]
postPersist: [ ]
preUpdate: [ ]
postUpdate: [ ]


MH\UserBundle\Entity\User:
type: entity
table: mh_user
repositoryClass: MH\UserBundle\Entity\UserRepository
id:
id:
type: integer
generator:
strategy: AUTO
fields:
first_name:
type: string
length: 100
nullable: true
last_name:
type: string
length: 100
nullable: true
created_at:
type: datetime
gedmo:
timestampable:
on: create
updated_at:
type: datetime
gedmo:
timestampable:
on: update
oneToMany:
user_friends:
targetEntity: MH\FriendshipBundle\Entity\Friendship
mappedBy: user
cascade: ["persist", "remove"]
friend_users:
targetEntity: MH\FriendshipBundle\Entity\Friendship
mappedBy: friend
cascade: ["persist", "remove"]
friend_groups:
targetEntity: MH\FriendshipBundle\Entity\FriendGroup
mappedBy: owner
cascade: ["persist", "remove"]
lifecycleCallbacks:
prePersist: [ ]
postPersist: [ ]
preUpdate: [ ]
postUpdate: [ ]

现在我有一个表单,它是通过友谊资源的 crud 生成器创建的,这就是我正在做的。

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('friend', 'entity', array(
'class' => 'UserBundle:User',
'property' => 'fullName',
'expanded' => true,
'multiple' => true,
'required' => false,
))
;

}

它呈现了我可以选择并保存为“ friend ”的用户复选框列表。

我的问题是:

  1. 保存时出现以下错误。

PHP Catchable fatal error: Argument 1 passed to MH\FriendshipBundle\Entity\Friendship::setFriend() must be an instance of MH\UserBundle\Entity\User, instance of Doctrine\Common\Collections\ArrayCollection given, called in /Users/mohammedhamad/Sites/sociabills/vendor/symfony/symfony/src/Symfony/Component/PropertyAccess/PropertyAccessor.php on line 345 and defined in /Users/mohammedhamad/Sites/sociabills/src/MH/FriendshipBundle/Entity/Friendship.php on line 155, referer: http://sociabills.local/friends/new

不确定如何确保将所选择的“ friend ”传递给需要集合的 setFriends 方法,而不是需要 User 对象的 setUser 方法。

  1. 如何让表单列出除已登录用户之外的所有其他用户。不想一个人和自己交 friend 。

最佳答案

查看文档

/**
* @ManyToMany(targetEntity="User", mappedBy="myFriends")
**/
private $friendsWithMe;

/**
* @ManyToMany(targetEntity="User", inversedBy="friendsWithMe")
* @JoinTable(name="friends",
* joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="friend_user_id", referencedColumnName="id")}
* )
**/
private $myFriends;

public function __construct() {
$this->friendsWithMe = new \Doctrine\Common\Collections\ArrayCollection();
$this->myFriends = new \Doctrine\Common\Collections\ArrayCollection();
}

// ...

注解的 YML 等价物是(请记住,我不习惯将 yml 用于实体映射,这未经过测试)

   manyToMany:
myFriends:
targetEntity: User
inversedBy: friendsWithMe
joinTable:
name: friends
joinColumns:
user_id:
referencedColumnName: id
inverseJoinColumns:
friends_user_id:
referencedColumnName: id
friendsWithMe:
targetEntity: User
mappedBy: myFriends

然后你可以在你的类中实现addMyFriend($friend)方法和removeMyFriend($friend)

public function addMyFriend($friend){

$this->myFriends[] = $friend;

}

public function removeMyFriend($friend)
{
$this->myFriends->removeElement($friend);
}

问题 2 由@Darragh 回答

关于php - Symfony2 自引用多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19964662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com