7

多対多の関係で、クエリビルダーでいくつかの問題に直面しています。

サブ会社を持つエンティティ会社があるため、次のようになります。

class Company {

private $id;

/**
* @var ArrayCollection
* 
* @ORM\ManyToMany(targetEntity="Company")
* @ORM\JoinTable(name="company_relation", 
*   joinColumns={ 
*     @ORM\JoinColumn(name="id", referencedColumnName="id")
*   },
*   inverseJoinColumns={ 
*     @ORM\JoinColumn(name="subcompany", referencedColumnName="id")
*   }
* )
*/    
private $ChildrenCompany;

[...]

}

次に、決定されたサブ会社 (たとえば、ID 5 のサブ会社) を持つ会社を返すクエリ ビルダーを作成しようとしています。私は2つの方法で試しました:

方法 A)

$query->select ('c');
$query->from(MyBundle:Company, 'c');
$query->leftJoin('c.ChildrenCompany','j');
$query->where('j.subcompany = 5'); 

それは機能せず、次のエラーが表示されます: Class Application\Sademer\CoreBundle\Entity\Company has no field or association named subcompany

方法 B)

$query->select ('c');
$query->from(MyBundle:Company, 'c');
$query->where('j.ChildrenCompany = 5'); 

それは機能せず、次のエラーが表示されます: Invalid PathExpression. StateFieldPathExpression または SingleValuedAssociationField が必要です。

4

3 に答える 3

30

join ステートメントを使用しない別の方法があります。次のコードを追加して、subcompanyId = 5 の会社を抽出するだけです。

$query->where(':subCompanyId MEMBER OF c.ChildrenCompany');  
$query->setParameter("subCompanyId", 5);

そして教義はあなたのために難しい仕事をします。素敵なコーディング時間をお過ごしください。

于 2015-07-10T11:09:20.880 に答える
2

このようにしてください

Aisel\PageBundle\Entity\Page:
type: entity
table: aisel_page
repositoryClass: Aisel\PageBundle\Entity\PageRepository
id:
    id:
        type: integer
        id: true
        generator:
            strategy: AUTO
fields:
   ...

manyToMany:
  categories:
    targetEntity: Aisel\CategoryBundle\Entity\Category
    joinTable:
      name: aisel_page_category
      joinColumns:
        page_id:
          referencedColumnName: id
      inverseJoinColumns:
        category_id:
          referencedColumnName: id

そしてあなたの機能で

public function getPagesByCategory($categoryId)
{
    $qb = $this->getEntityManager()->createQueryBuilder();

    $categoryId = 291; // CategoryId
    $r = $qb->select('p')
        ->from('AiselPageBundle:Page', 'p')
        ->innerJoin('p.categories','c')
        ->where('p.status = 1')
        ->andWhere('p.isHidden != 1')
        ->andWhere('c.id = :categoryId')->setParameter('categoryId',$categoryId)
        ->getQuery()
        ->execute();

    return $r;
}
于 2014-02-23T12:28:53.493 に答える