[英]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.