0

Symfony2/Doctrine で manyToMany 関係を実装しました。関係はエンティティ自体です (追加の列を追加する必要があったため、これが必要でした -これらの追加の列は以下に記載されていないことに注意してください)。

このあたりには、関係をエンティティとして捉えることを推奨する Q&A がいくつかあります (たとえば、ここここここ、またはここ)。

を介してすべてのゲッター メソッドとセッター メソッドを自動的に生成しました (これは、の代わりにdoctrine:generate:entities呼び出される理由を説明しています)。addCompanieaddCompany

これまでのところ、ユーザーと会社の作成は正常に機能しています。しかし、ユーザーを会社に割り当てようとするとすぐに、次のエラー メッセージが表示されます。

関連付け 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();
4

1 に答える 1

0

Bronchas answer here のおかげで、私はそれを見つけました。コントローラ ロジックは次のように実装できます。

// Create new User (employee)
$user = new User();
$em = $this->getDoctrine()->getManager();
$em->persist($user);

// Create new Company (employer)
$company = new Company();
$em->persist($company);

// Employ User at Company
$employment = new CompanyHasUser();
$employment->setEmployees($user);
$employment->setCompanies($company);
$em->persist($employment);

// Flush
$em->flush(); 
于 2013-08-15T10:49:38.443 に答える