Первое в вашем коде:
$product->setCategory("category A");
У вас не может быть этого, потому что для этого нужен объект, но я буду считать, что вы упростили свой код ради вопроса.
Вашпроблема заключается в том, что вы добавляете ассоциацию к продукту, но не добавляете ассоциацию к своей категории.
Обычно это имеет два решения:
// In your Product entity add cascade persist, this will check your categories as well and schedule them for persist during flush
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Category", inversedBy="products", cascade={"persist"})
* @ORM\JoinColumn(name="category_id", referencedColumnName="id", nullable=false)
*/
protected $category;
Следующее решение (я предпочитаю,потому что у вас есть все время контроль над всем).
// In your product entity set Category
public function setCategory(Category $category) {
$this->category = $category;
$category->addProduct($this);
}
// In you Category entity
public function addProduct(Product $product) {
if (!$this->products->contains($product)) {
$this->product->add($product);
}
}
Вы можете использовать оба одновременно.