我使用多对多关系;
用户实体;
/**
* @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();