gpt4 book ai didi

lazy-loading - Doctrine ArrayCollection

转载 作者:行者123 更新时间:2023-12-04 06:36:14 26 4
gpt4 key购买 nike

好的,我有一个 User 实体如下

<?php
class User
{
/**
* @var integer
* @Id
* @Column(type="integer")
* @GeneratedValue
*/
protected $id;
/**
* @var \Application\Entity\Url[]
* @OneToMany(targetEntity="Url", mappedBy="user", cascade={"persist", "remove"})
*/
protected $urls;
public function __construct()
{
$this->urls = new \Doctrine\Common\Collections\ArrayCollection();
}
public function addUrl($url)
{
// This is where I have a problem
}
}

现在,我想要做的是检查用户是否已经拥有 $url$urls ArrayCollection在坚持之前 $url .

现在我发现的一些例子说我们应该做类似的事情
if (!$this->getUrls()->contains($url)) {
// add url
}

但这不起作用,因为它比较了元素值。如 $url没有 id值,这将总是失败和 $url将被复制。

因此,如果有人能解释我如何向 ArrayCollection 添加元素,我将不胜感激。没有坚持并避免重复 ?

编辑

我已经设法通过
$p = function ($key, $element) use ($url) 
{
if ($element->getUrlHash() == $url->getUrlHash()) {
return true;
} else {
return false;
}
};

但这不是仍然加载所有网址然后执行检查吗?我认为这效率不高,因为每个用户可能有数千个 url。

最佳答案

这还不可能以“域驱动”的方式实现,即。只是使用对象。您应该执行查询以检查是否存在:

SELECT count(u.id) FROM User u WHERE ?1 IN u.urls AND u.id = ?2

使用 Doctrine 2.1,这将可以使用两个新功能的组合:

  • 超懒人收藏
  • @IndexBy 用于集合,因此您可以定义 @OneToMany(targetEntity="Url", indexBy="location")
  • ExtraLazy Collection 使用 ->contains() 支持索引。

  • 第 1 点和第 2 点已在 Doctrine 2 master 中实现,但仍缺少第 3 点。

    关于lazy-loading - Doctrine ArrayCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4839982/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com