首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >主义ManyToMany关系

主义ManyToMany关系
EN

Stack Overflow用户
提问于 2016-05-14 03:17:54
回答 1查看 138关注 0票数 1

很简单(我想!),我有一个发票实体,一个优惠券实体。发票上可以有许多优惠券。优惠券反过来,可以在许多发票中使用。

不包括getter/setters:

发票

代码语言:javascript
运行
复制
namespace Application\Entity;

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

/**
 * @ORM\Entity
 * @ORM\Table(name="invoices")
 */
class Invoice
    /**
     * @ORM\ManyToMany(targetEntity="Application\Entity\Coupon")
     * @ORM\JoinTable(name="invoices_coupons")
     */
    protected $coupons;

    public function addCoupon( Coupon $coupon ){
        if( !$this->coupons )
            $this->coupons = new ArrayCollection();

        $this->coupons->add($coupon);
    }
}

优惠券

代码语言:javascript
运行
复制
/**
 * @ORM\Entity
 * @ORM\Table(name="coupons", indexes={@ORM\Index(name="code_idx", columns={"code"})})
 */
class Coupon implements CandidateInterface
{
    /**
     * @var \Ramsey\Uuid\Uuid
     *
     * @ORM\Id
     * @ORM\Column(type="uuid")
     * @ORM\GeneratedValue(strategy="CUSTOM")
     * @ORM\CustomIdGenerator(class="Ramsey\Uuid\Doctrine\UuidGenerator")
     */
    protected $id;

    /**
     * @var string
     * @ORM\Column(type="string", length=32, unique=true)
     */
    protected $code;

}

当我按照预期运行助手工具来生成模式时,它会创建一个连接表invoices_coupons,其中包含coupon_id,invoice_id (完美)。

因此,在代码中,我有一个现有的存储发票和一个类似的现有优惠券。

看来我做不到:

代码语言:javascript
运行
复制
// runs a QB to return the coupon, returns a Coupon Entity
$coupon = $couponMapper->getActiveByCode('SAVEBIG'); 
$invoice->addCoupon( $coupon );
$invoiceMapper->getEntityManager()->update( $invoice );
$invoiceMapper->getEntityManager()->flush();

我知道这个错误:

通过relationship \Application\Entity\Invoice#coupons找到了一个新的实体,该实体未被配置为级联实体的持久化操作:(优惠券toString)。要解决这个问题,要么在这个未知实体上显式调用EntityManager#persist(),要么配置级联,在映射中持久化这个关联,例如@ManyToOne(..,cascade={\u0022持久化\u0022})。

现在,我不想让它产生新的优惠券,它为什么要这样做呢?优惠券已经存在,它是从ER加载的,并且正在添加到现有的实体中。

如果我按错误消息说的做,它将尝试将新的优惠券复制到优惠券表中。

谢谢你的建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-16 00:41:08

Doctrine\ORM\EntityManager::update()似乎并不是一个存在的东西。您不应该在addCoupon()调用和刷新()调用之间做任何事情。

如果简化代码不能神奇地修复它,那么下一步应该是确保$couponMapper->getEntityManager() === $invoiceMapper->getEntityManager()

还不清楚如何实例化这些映射类,但重要的是要了解每个EntityManager为实体维护自己的内部标识图。因此,如果您的DIC由于某种原因正在实例化两个不同的$coupon (每个Mapper一个),那么$invoiceMapper的EM将不承认该是一个托管实体。

如果是这样的话会很奇怪的。假设您使用的是ZF2的ServiceManager,则必须显式地将EntityManger服务设置为不共享。

但是,考虑到您提供的代码,有两个不同的EntityManagers是我能想到的最明显的事情。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37222126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档