Symfony2/Doctrine で manyToMany 関係を実装しました。関係はエンティティ自体です (追加の列を追加する必要があったため、これが必要でした -これらの追加の列は以下に記載されていないことに注意してください)。
このあたりには、関係をエンティティとして捉えることを推奨する Q&A がいくつかあります (たとえば、ここ、ここ、ここ、またはここ)。
を介してすべてのゲッター メソッドとセッター メソッドを自動的に生成しました (これは、の代わりにdoctrine:generate:entities
呼び出される理由を説明しています)。addCompanie
addCompany
これまでのところ、ユーザーと会社の作成は正常に機能しています。しかし、ユーザーを会社に割り当てようとするとすぐに、次のエラー メッセージが表示されます。
関連付け Acme\MyBundle\Entity\Company#employees でタイプ Acme\MyBundle\Entity\User のエンティティが見つかりましたが、Acme\MyBundle\Entity\CompanyHasUser が必要です
これらは私の Doctrine 定義 (yml) です:
# User
Acme\MyBundle\Entity\User:
type: entity
fields:
id:
id: true
type: integer
generator:
strategy: AUTO
oneToMany:
companies:
targetEntity: Acme\MyBundle\Entity\CompanyHasUser
mappedBy: employees
# Company
Acme\MyBundle\Entity\Company:
type: entity
fields:
id:
id: true
type: integer
generator:
strategy: AUTO
oneToMany:
employees:
targetEntity: Acme\MyBundle\Entity\CompanyHasUser
mappedBy: companies
# CompanyHasUser
Acme\MyBundle\Entity\CompanyHasUser:
type: entity
fields:
id:
id: true
type: integer
generator:
strategy: AUTO
manyToOne:
companies:
targetEntity: Acme\MyBundle\Entity\Company
inversedBy: employees
joinColumns:
company_id:
referencedColumnName: id
nullable: false
employees:
targetEntity: Acme\MyBundle\Entity\User
inversedBy: companies
joinColumns:
user_id:
referencedColumnName: id
nullable: false
これは私のエンティティクラスのユーザーがどのように見えるかです
namespace Acme\MyBundle\Entity;
class User
{
private $id;
private $companies;
public function __construct()
{
$this->companies = new \Doctrine\Common\Collections\ArrayCollection();
}
public function addCompany(\Acme\MyBundle\Entity\CompanyHasUser $companies)
{
$this->companies[] = $companies;
return $this;
}
public function removeCompany(\Acme\MyBundle\Entity\CompanyHasUser $companies)
{
$this->companies->removeElement($companies);
}
public function getCompanies()
{
return $this->companies;
}
}
これは私のエンティティクラスの会社がどのように見えるかです
namespace Acme\MyBundle\Entity;
class Company
{
private $id;
private $employees;
public function __construct($name, $companyAdmin)
{
$this->employees = new \Doctrine\Common\Collections\ArrayCollection();
}
public function addEmployee(\Acme\MyBundle\Entity\CompanyHasUser $employees)
{
$this->employees[] = $employees;
return $this;
}
public function removeEmployee(\Acme\MyBundle\Entity\CompanyHasUser $employees)
{
$this->employees->removeElement($employees);
}
public function getEmployees()
{
return $this->employees;
}
}
そして、これは私のエンティティクラスCompanyHasUserがどのように見えるかです ( と の間の関係User
ですCompany
が、この関係にさらに列が含まれている限り - これらのコードスニペットでは言及されていません - エンティティとして作成する必要がありました):
namespace Acme\MyBundle\Entity;
class CompanyHasUser
{
private $companies;
private $employees;
public function setCompanies(\Acme\MyBundle\Entity\Company $companies)
{
$this->companies = $companies;
return $this;
}
public function getCompanies()
{
return $this->companies;
}
public function setEmployees(\Acme\MyBundle\Entity\User $employees)
{
$this->employees = $employees;
return $this;
}
public function getEmployees()
{
return $this->employees;
}
}
私のコントローラーのロジックは次のとおりです。
// Create new User (employee)
$user = new User();
$em = $this->getDoctrine()->getManager();
$em->persist($user);
// Create new Company (employer)
$company = new Company();
// Create relationship
$company->addEmployee($user);
$em->persist($company);
// Flush
$em->flush();