【问题标题】:Query with Criteria Exception error in doctrine2,Symfony2在教义 2、Symfony2 中使用标准异常错误进行查询
【发布时间】:2015-11-22 15:21:13
【问题描述】:

我在 symfony2 和教义 2 中遇到问题。当我添加一个 Criteria 异常时,它看起来不像我想要的那样。这是代码:

型号

/**
 * @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 = ?

【问题讨论】:

  • 可以加Users实体码吗?
  • 这是jpst.it/DkP7
  • 你的accepted字段在哪里?
  • 不,我不在 Users 实体中使用 accepted 字段,我在 Friend 实体中使用它:jpst.it/DkSm 。我只是想创建一个小型社交网络,并且在这个阶段我想向用户朋友展示(接受的行为true'1')感谢您的关心,

标签: php symfony doctrine-orm zend-framework2 doctrine


【解决方案1】:

Doctrine 为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 %}

【讨论】:

  • 非常感谢,我确信这是正确的回应.. 但我还有一个小问题:目标实体 social\socialBundle\Entity\Friend 在'social\socialBundle 中找不到\Entity\users#friends
  • 我更喜欢对实体、控制器、服务使用大写字母。关于您的问题,将所有Friend 更改为friends,将User 更改为users
  • 真的不知道怎么想你,但是这个不要给出我想在视图中使用的用户表的结果:jpst.it/Dk_3 .. 给您带来的不便很抱歉
  • 更新了答案,您的user 变量是Friend 的实例。
  • 那么,我该怎么办?
猜你喜欢
  • 2012-01-01
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 2018-08-04
  • 1970-01-01
  • 2015-11-30
  • 2014-07-23
  • 2013-04-18
相关资源
最近更新 更多