Symfony2 - 多对多关系和 LIMIT

标签 symfony repository many-to-many limit relationship

我使用多对多关系;

用户实体;

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

对话实体;

/**
 * @ORM\ManyToMany(targetEntity="User", mappedBy="conversations")
 * @ORM\JoinTable(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 = ?

并选择所有对话。这将是性能问题。所以,我使用存储库类。但是,我无法同时使用多对多和限制功能。我应该怎么办?我向存储库类写入什么?

最佳答案

如果您想优化对学说中大型集合的访问,只需使用 Criteria (That only works on OneToMany associations.)

示例:

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);
    }
}

对于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();
}

关于Symfony2 - 多对多关系和 LIMIT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22181653/

相关文章:

php - Symfony2 Doctrine Qb STR_TO_DATE 未知函数

symfony - 在Symfony2单选按钮选择字段上设置默认值

java - 使用不同的jdks将项目构建到不同的存储库中

Laravel:从多对多关系中选择条件

c# - 使用 Entity Framework 删除多对多关系

php - 遍历学说集合占用太多内存

Eclipse 导入 > Git 选项不可用

c# 通用存储库类

many-to-many - SQLAlchemy 多对多动态集合类关系

symfony - 如何使用 JMS Serializer 和 Symfony2 实现模型侧加载