Symfony2 - 多对多关系和限制



我使用多对多关系;

用户实体;

/**
 * @ORMManyToMany(targetEntity="Conversation", inversedBy="users")
 */
protected $conversations;

对话实体;

/**
 * @ORMManyToMany(targetEntity="User", mappedBy="conversations")
 * @ORMJoinTable(name="user_conversation")
 */
protected $users;

当,我使用此功能;

$user->getConversations();

Symfony在后台工作这个SQL代码;

SELECT 
  t0.id AS id1, 
  t0.conversationid AS conversationid2 
FROM 
  Conversation t0 
  INNER JOIN user_conversation ON t0.id = user_conversation.conversation_id 
WHERE 
  user_conversation.user_id = ?

并选择所有对话。这将是性能问题。所以,我使用存储库类。但是,我不能一起进行多对多和限制功能。我该怎么办?我写到存储库类的内容?

如果您想在原则中优化对大型集合的访问,只需使用标准(这仅适用于 OneToMany 关联。

例:

use DoctrineORMMapping as ORM;
use DoctrineCommonCollectionsCriteria;
/**
 * @ORMEntity
 * @ORMTable
 */
class User
{
    ....
    public function getLatestConversation()
    {
        $criteria = Criteria::create()
            ->setMaxResults(10);
        return $this->conversations->matching($criteria);
    }
}

对于多对多,我认为您必须创建自定义查询:

public function getLatestConversations($user)
{
    $qb = $this->createQueryBuilder("c");
    $qb
        ->leftjoin("c.users", "u")
        ->where("u = :user")
        ->setParameter("user", $user)
        ->setMaxResults(2);
    return $qb->getQuery()->getResult();
}

您可以将其转换为 Arraycollection Object:

$input = $repo->getConversations(); //manytomany relation
$arr = new ArrayCollection();
foreach ($input as $e){
    $arr->add($e);
}

然后使用您的标准$arr

尝试

$repository = $em->getRepository('YourBundle:Conversations');
$query = $repository->createQueryBuilder('C')
       ->join('C.Users', 'U')
       ->where('U.id = :uid')
       ->setMaxResults(20) //set your amount for limit
       ->setParameter('uid', $user_id)
       ->getQuery();
$result = $query->getResults();

最新更新