Symfony2 - 多对多关系和LIMIT

use*_*616 3 many-to-many repository limit relationship symfony

我使用多对多的关系;

用户实体;

/**
 * @ORM\ManyToMany(targetEntity="Conversation", inversedBy="users")
 */
protected $conversations;
Run Code Online (Sandbox Code Playgroud)

会话实体;

/**
 * @ORM\ManyToMany(targetEntity="User", mappedBy="conversations")
 * @ORM\JoinTable(name="user_conversation")
 */
protected $users;
Run Code Online (Sandbox Code Playgroud)

什么时候,我工作这个功能;

$user->getConversations();
Run Code Online (Sandbox Code Playgroud)

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 = ?
Run Code Online (Sandbox Code Playgroud)

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

a.a*_*dad 5

如果要在doctrine中优化对大型集合的访问,只需使用Criteria(仅适用于OneToMany关联.)

例:

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\Criteria;

/**
 * @ORM\Entity
 * @ORM\Table
 */
class User
{
    ....

    public function getLatestConversation()
    {
        $criteria = Criteria::create()
            ->setMaxResults(10);

        return $this->conversations->matching($criteria);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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();
}
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考.使用doctrine 2.5标准将适用于ManyToMany.见http://www.doctrine-project.org/jira/browse/DDC-2061 (2认同)