通过公司加品牌,可以吗?如何?

Add brands through company, it's possible? How?

我将这两个表(见下图)映射如下:

class Brand
{
    ...

    /**
     * @var Company
     *
     * @ORM\ManyToOne(targetEntity="Company")
     * @ORM\JoinColumn(name="companies_id", referencedColumnName="id")
     */
    protected $company;

}

class Company
{
    ...  
}

我需要添加对从 Company 添加新的 Brand 的支持,但我不知道如何实现这一点。这是通过 SonataAdminBundle 处理的,但我认为我需要向实体添加其他内容才能从公司创建品牌,但我不确定这是什么,我能得到一些帮助吗?我卡住了

第一次尝试

得到答案后,这就是我修改 Company 实体的方式:

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

class Company
{
    ...

    /**
     * @var Brand
     * @ORM\OneToMany(targetEntity="Brand", mappedBy="company", cascade={"persist"})
     **/
    protected $brands;

    public function __construct()
    {
        $this->brands = new ArrayCollection();
    }

    ...

    public function getBrands()
    {
        return $this->brands;
    }

    /**
     * Add brands
     *
     * @param Brand $brand
     * @return Brands
     */
    public function addBrand( Brand $brand)
    {
        $this->brands[] = $brand;
        return $this;
    }

    /**
     * Remove brands
     *
     * @param Brand $brand
     */
    public function removeBrand( Brand $brand)
    {
        $this->brands->removeElement($brand);
    }
}

但是我收到这个错误:

No entity manager defined for class Doctrine\Common\Collections\ArrayCollection

这是为什么?

您可以尝试像这样设置您的实体:

class Brand
{
    /**
     * @var Company
     *
     * @ORM\ManyToOne(targetEntity="Company", inversedBy="brands")
     * @ORM\JoinColumn(name="companies_id", referencedColumnName="id")
     */
    protected $company;
}

class Company
{
    /**
     * @var ArrayCollection
     *
     * @OneToMany(targetEntity="Brand", mappedBy="company", cascade={"persist"})
     **/
    protected $brands;
}

我们在这里定义的是,可以从具有 cascade={"persist"}Company 实体创建新的 Brands

建议您在 Company 中实现 addBrandremoveBrand,以便与 ArrayCollection.

直接交互

最终功能的一个简单示例:

$company = $service->getCompany(1); // our company entity

$brand = new Brand();
$brand->set...
...

$company->addBrand($brand);

$entityManager->persist($company);

编辑

这只是一个示例,您可以选择不使用键添加甚至实现删除功能,但这是一个起点:

public function addBrand(Brand $brand)
{
    // key needs to be something that can uniquely identify the brand
    // e.g. name
    $this->getBrands()->set(*key*, $brand);

    return $this;
}

public function removeBrand($key)
{
    $this->getBrands()->remove($key);

    return $this;
}