2015-05-01 3 views
1

У меня есть 2 enteties.Проблема с ManyToMany отношения

Пакет и StockItem.

В пакете может быть много StockItems, а StockItem может принадлежать многим пакетам. Кажется, что наиболее подходящим является ManyToMany.

Проблема возникает при попытке добавить 2 той же stockitems в пакет, мы получаем нарушение Integraty:

{"code":500,"message":"An exception occurred while executing 'INSERT INTO StockItem_In_Package (package_id, stockitem_id) VALUES (?, ?)' with params [4, 1]:\n\nSQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '4-1' for key 'PRIMARY'"} 

Поскольку пакет (ID 4), создает 2 отношения с stockItem 1.

4-1 и 4-1

Можно ли обойти это каким-либо образом? Можно ли добавить третий столбец с именем id в таблицу ManyToMany или добавить один элемент ItemCountInPackage и просто увеличить его на единицу, если тот же самый добавлен в пакет? Что было бы лучшим решением.

пакет Entity, только вставив соответствующий код:

/** 
* Package 
* 
* @ORM\Table() 
* @ORM\Entity(repositoryClass="IHEnterprise\LogisticsBundle\Entity\PackageRepository") 
* @ORM\HasLifecycleCallbacks 
* 
* @ExclusionPolicy("all") 
* 
*/ 
class Package 
{ 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    * @Expose 
    */ 
    private $id; 

    /** 
    * @ORM\ManyToMany(targetEntity="IHEnterprise\LogisticsBundle\Entity\StockItem", cascade={"all"}, indexBy="package_id") 
    * @ORM\JoinTable(name="StockItem_In_Package", 
    *  joinColumns={@ORM\JoinColumn(name="package_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="stockitem_id", referencedColumnName="id")} 
    *  ) 
    * @Expose 
    * @Assert\NotNull() 
    **/ 
    private $stockItems; 
} 

StockItem Entity, только вставив соответствующий код:

/** 
* StockItem 
* 
* @ORM\Table() 
* @ORM\Entity(repositoryClass="IHEnterprise\LogisticsBundle\Entity\StockItemRepository") 
* @ORM\HasLifecycleCallbacks 
* 
* @ExclusionPolicy("all") 
* 
*/ 
class StockItem 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    * @Expose 
    */ 
    private $id; 
} 

мне не нужно следить за то, что принадлежит StockItems, к которому упаковывает, только какие пакеты содержат эти запасы.

ответ

0

Похоже, вы пытаетесь вставить элемент, который уже был в базе данных, в качестве новой записи. Чтобы предотвратить такую ​​ошибку, выполните следующие действия:

/** 
* @desc Add only new items to a single package 
* @param \AcmeBundle\Entity\Package $package 
* @param ArrayCollection<StockItem> $stockItems 
*/ 
public function addStockItemsAction(Package $package, $stockItems) { 
    foreach ($stockItems as $stockItem) { 
     if ($package->contains($stockItem) === false) { 
      $package->addStockItem($stockItem); 
     } 
    }  
} 
+0

Да, я, так как их должно быть 2 из них –

+0

Хум, это не выполнимо. Отношение должно быть уникальным. Вы можете клонировать вашу сущность так, чтобы у вас был дубликат, но вы не можете добавить дважды то же отношение. Это технически не выполнимо и концептуально неправильно:/Могу ли я узнать, зачем вам это нужно. Должен быть другой способ сделать это. –

+0

О, я думаю, что знаю, чего ты хочешь. Вы делаете это, потому что хотите обрабатывать количество в запасе для одного элемента? –

1

Вы не можете добавить третью колонку в свои отношения ManyToMany. Таким образом, вы не можете иметь один и тот же файл StockItem дважды в одном пакете.

Чтобы иметь более чем одну часть той же StockItem в одном пакете, вы должны создать третий объект с уникальным идентификатором, и отношения ManyToOne к StockItem и пакет (и OneToMany отношения в StockItem & пакет для вашей третьей организация).

+0

I двойной это. Я сделал то же самое некоторое время назад. – tomazahlin

Смежные вопросы