通过公司加品牌,可以吗?如何?
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
中实现 addBrand
和 removeBrand
,以便与 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;
}
我将这两个表(见下图)映射如下:
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
中实现 addBrand
和 removeBrand
,以便与 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;
}