2016-06-13 7 views
1

と友だちの関係を実装すると、Implementing a friends list in Symfony2.1 with Doctrine、 という投稿に基づいて@Roberto Trunfioのソリューションが実装されました。symfony3でDoctrine

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

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

それは動作しますが、しかし、私は「...送信者、受信者、地位、sendingDate」のような余分なフィールドを追加することによって、さらに行きたいと思いますが、私はそれを統合する方法がわかりません。誰かが私を助けてくれる?ありがとう

答えて

1

アソシエーションを追加のアトリビュートで飾りたい場合は、アソシエーションクラスが必要です。 From the documentation(ビットをスクロールダウン):あなたの例では

Why are many-to-many associations less common? Because frequently you want to associate additional attributes with an association, in which case you introduce an association class. Consequently, the direct many-to-many association disappears and is replaced by one-to-many/many-to-one associations between the 3 participating classes.

関連クラスは友情です。ユーザーは多くの友人を持つことができ、ユーザーは多くのユーザーの友人になることができます。より技術的には、ユーザーは多くの友人関係を持ち、多くの友人関係は友人にマップされます。下記の例では、Friendshipは追加の属性$hasBeenHelpful(実際には非対称です)を持っています。

// src/AppBundle/Entity/User.php 
/** 
* @ORM\Entity 
*/ 
class User 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\Column(type="string") 
    */ 
    private $name; 

    /** 
    * The people who I think are my friends. 
    * 
    * @ORM\OneToMany(targetEntity="Friendship", mappedBy="user") 
    */ 
    private $friends; 

    /** 
    * The people who think that I’m their friend. 
    * 
    * @ORM\OneToMany(targetEntity="Friendship", mappedBy="friend") 
    */ 
    private $friendsWithMe; 

    // … 
} 

と友情協会:あなたはおそらく、こんにちはな

<?php 

use Doctrine\Common\Collections\ArrayCollection; 

class User 
{ 
    public function __construct() 
    { 
     $this->friends = new ArrayCollection(); 
     $this->friendsWithMe = new ArrayCollection(); 
    } 

    public function addFriendship(Friendship $friendship) 
    { 
     $this->friends->add($friendship); 
     $friendship->friend->addFriendshipWithMe($friendship); 
    } 

    public function addFriendshipWithMe(Friendship $friendship) 
    { 
     $this->friendsWithMe->add($friendship); 
    } 

    public function addFriend(User $friend) 
    { 
     $fs = new Friendship(); 
     $fs->setUser($this); 
     $fs->setFriend($friend); 
     // set defaults 
     $fs->setHasBeenUseful(true); 

     $this->addFriendship($fs); 
    } 
} 
+0

として、Userクラスにあなたの答えに感謝し、いくつかの機能を追加したい

// src/AppBundle/Entity/Friendship.php /** * @ORM\Entity */ class Friendship { /** * @ORM\ManyToOne(targetEntity="User", inversedBy="friends") * @ORM\Id */ private $user; /** * @ORM\ManyToOne(targetEntity="User", inversedBy="friendsWithMe") * @ORM\Id */ private $friend; /** * Example of an additional attribute. * * @ORM\Column(type="boolean") */ private $hasBeenHelpful; // … } 

。このエラーが発生しました: タイプエラー:AppBundle \ Entity \ User :: addFriend()に渡された引数1は、AppBundle \ Entity \ Userのインスタンスである必要があります。 、/Applications/MAMP/htdocs/equilike/src/AppBundle/Controller/Member/FriendController.php(35行目) どのように修正できますか? (私のフレンドシップ管理コードが長すぎてコメントに追加できません) – matth

+0

FriendControllerは '$ user-> addFriend($ otherUser)'を呼び出しますが、署名は 'addFriend(Friendship $ fs)'です。署名を 'addFriend(User $ friend)'に変更して、この関数の中でデフォルトの属性を持つ友だちオブジェクトを作成することができます。関数 'addFriendship(Friendship $ fs)'も追加する必要があります。 – Lumen

+0

こんにちは、ありがとう。私の追加機能が今働いています。しかし、私はそれがTwitterのような「フォロー」機能のように機能し、Facebookのような「友情」は好きではないと思う。 私は間違っていますか?あるいは、私の団体協会の組織を再考するべきですか?私は何をしたいのですか?助けてくれてありがとう – matth

関連する問題