2015-11-22 23 views
1

我在symfony2和doctrine2有問題。當我添加一個Criteria異常時,它不會顯示爲我想要的。這是代碼:查詢條件異常錯誤在doctrine2,Symfony2

模型

/** 
* @ORM\ManyToMany(targetEntity="users",inversedBy="friends",cascade={"ALL"}) 
* @ORM\JoinTable(name="friends", 
*  joinColumns={@ORM\JoinColumn(name="friend_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}, 
*  ) 
*/ 
private $friendsof; 

public function getusersre() { 

    $criteria = new Criteria(); 
    $criteria->Where($criteria->expr()->eq('accepted', '1')); 
    return $this->friendsof->matching($criteria); 

} 

輸出

SELECT te.id AS id, te.email AS email, te.username AS username 
FROM users te JOIN friends t ON t.user_id = te.id 
WHERE t.friend_id = ? AND te.accepted = ? 

我希望它出現這樣的:

WHERE t.friend_id = ? AND t.accepted = ? 
+0

您可以加入'Users'實體代碼? –

+0

這是http://jpst.it/DkP7 –

+0

你的「接受」字段在哪裏? –

回答

0

學說生成中間表Many to Many關係。你不能添加任何字段到該表。我的意思是accepted。你也有三個表:

  • 用戶。
  • 許多關係的中間表。
  • 朋友。

在你的getusersre函數中,你想嘗試找朋友。據我所知,根據您的要求,不可能爲您的標準添加accepted字段。

另外我改變了你的結構。你怎麼看待這件事?

class User 
{ 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="username", type="string", length=255, unique=true) 
    */ 
    private $username; 


    /** 
    * @ORM\OneToMany(targetEntity="Friend", mappedBy="userId") 
    */ 
    private $friends; 

    //Other fields, getters and setters. 
} 

class Friend 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="User", inversedBy="friends") 
    * @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
    */ 
    protected $userId; 

    /** 
    * @ORM\ManyToOne(targetEntity="User", inversedBy="friends") 
    * @ORM\JoinColumn(name="friend_id", referencedColumnName="id") 
    */ 
    protected $friendId; 

    /** 
    * @ORM\Column(name="accepted", type="boolean") 
    */ 
    protected $accepted; 

    //Other fields, getters and setters 
} 

Friend實體的名稱不穩定。您可以使用FriendRelationship

另外,功能getAcceptedFriends會這樣。

public function getAcceptedFriends() 
{ 
    $cr = Criteria::create(); 
    $cr->andWhere($cr->expr()->eq('accepted', 1)); 

    return $this->friends->matching($cr); 
} 

或者

public function getAcceptedFriends() 
{ 
    $friends = []; 
    /** @var Friend $friend */ 
    foreach ($this->friends as $friend) { 
     if ($friend->getAccepted()) $friends[] = $friend; 
    } 

    return $friends; 
} 

您可以使用這樣的。

foreach($user->getAcceptedFriends() in $friendRelationship){ 

    // $friendRelationship is a instance of Friend. 
    $username = $friendRelationship->getFriendId()->getUsername(); 
} 

在樹枝

{% for fr in user.acceptedFriends %} 
    {{ fr.friendId.username }} 
{% else %} 
    {{ 'No friend' }} 
{% endfor %} 
+0

非常感謝,我確信這是正確的我仍然有一個小問題: 目標實體social \ socialBundle \ Entity \ Friend無法在'social \ socialBundle \ Entity \ users#朋友中找到 –

+0

我更喜歡使用大小寫字母來表示實體,控制器和服務。關於你的問題,把所有的「朋友」改爲「朋友」,把「用戶」改爲「用戶」。 –

+0

真的我不知道怎麼想你,但是這不要給用戶表的結果,我想在視圖中使用:http://jpst.it/Dk_3 ..對不便 –