簡體   English   中英

學說多對多關系

[英]Doctrine ManyToMany Relationship

非常簡單(我想!),我有一個發票實體和一個優惠券實體。 發票上可以應用許多優惠券。 相反,優惠券可用於許多發票。

不包括吸氣劑/吸氣劑:

發票

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

我收到此錯誤:

通過關系\\ Application \\ Entity \\ Invoice#coupons找到了一個新實體,該實體未配置為級聯實體的持久化操作:(優惠券toString)。 解決此問題的方法:在此未知實體上顯式調用EntityManager#persist()或配置級聯,將該關聯保留在映射中,例如@ManyToOne(..,cascade = {\\ u0022persist \\ u0022})。

現在,我不希望它創建新的優惠券。 為什么要嘗試這個? 優惠券已存在,已從ER加載,並已添加到現有實體。

如果我按照錯誤消息的指示進行操作,它將嘗試將新的優惠券復制到優惠券表中。

感謝您的建議。

Doctrine\\ORM\\EntityManager::update()似乎不存在。 在addCoupon()調用和flush()調用之間,您不必做任何事情。

如果簡化代碼並不能解決問題,那么下一步應該是確保$couponMapper->getEntityManager() === $invoiceMapper->getEntityManager()

目前尚不清楚如何實例化這些映射器類,但是了解每個EntityManager維護自己的實體內部身份映射非常重要。 因此,如果您的DIC由於某種原因實例化了兩個不同的EM(每個Mapper一個),那么$ invoiceMapper的EM不會將$ coupon識別為托管實體。

那樣的話將很奇怪。 假設您使用的是ZF2的ServiceManager,則必須明確將EntityManger服務設置為不共享。

但是考慮到您提供的代碼,以某種方式擁有兩個不同的EntityManager是最明顯的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM