简体   繁体   English

在doctrine2,Symfony2中有条件异常查询

[英]Query with Criteria Exception error in doctrine2,Symfony2

I have a problem in symfony2 and doctrine2. 我在symfony2和doctrine2中有问题。 When I add a Criteria exception, it doesn't appear like I want. 当我添加一个Criteria异常时,它看起来不像我想要的那样。 This is the code: 这是代码:

Model 模型

/**
 * @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);

}

Output 产量

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 = ?

I want that it appear like this: 我希望它看起来像这样:

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

Doctrine generates intermediate table for Many to Many relationship. 教义Many to Many关系生成中间表。 And you can't add any field to that table. 而且您不能在该表中添加任何字段。 I mean field accepted . 我的意思是现场accepted Also you have three tables: 另外,您有三个表:

  • Users. 用户。
  • Intermediate table for many to many relationship. 中间表对于多对多关系。
  • Friends. 友。

In your getusersre function you want to try get friends. 在您的getusersre函数中,您想尝试结识朋友。 As I understood it is impossible to add accepted field for your criteria as you wanted. 据我了解,无法根据需要为您的条件添加accepted字段。

Also I have changed your structure. 我也改变了你的结构。 What do you think about it? 你怎么看待这件事?

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
}

The name of Friend entity is not solid. Friend实体的名称不是固定的。 You can use FriendRelationship . 您可以使用FriendRelationship

Also,function getAcceptedFriends will like that. 另外,函数getAcceptedFriends会喜欢的。

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

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

Or 要么

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

    return $friends;
}

You can use like that. 您可以那样使用。

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

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

In twig 在树枝上

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM