很简单(我想!),我有一个发票实体,一个优惠券实体。发票上可以有许多优惠券。优惠券反过来,可以在许多发票中使用。
不包括getter/setters:
发票
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);
    }
}优惠券
/**
 * @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 (完美)。
因此,在代码中,我有一个现有的存储发票和一个类似的现有优惠券。
看来我做不到:
// 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加载的,并且正在添加到现有的实体中。
如果我按错误消息说的做,它将尝试将新的优惠券复制到优惠券表中。
谢谢你的建议。
发布于 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是我能想到的最明显的事情。
https://stackoverflow.com/questions/37222126
复制相似问题