使用Doctrine join选择多个实体的过滤集合

时间:2014-09-29 19:11:23

标签: symfony doctrine-orm

我想使用doctrine join选择两个实体。

$query = $em->createQuery("SELECT u, a FROM User u JOIN u.addresses a WHERE a.city =      'Berlin'");
$users = $query->getResult();

我已关注documentation here,查询工作正常,但我没有管理如何获取第二个实体。

我尝试了这个,但它加载了空洞地址数组

foreach($users as $user){
   echo($user->getAddresses();//this contains all addresses not the filtered address
}

文档中提到了有关水合变量User#address的内容,但没有提到如何获取它。

User.orm.yml

 Home\DinnerBundle\Entity\User:
  type: entity
  table: user
  id:
    id:
      type: integer
      generator: { strategy: AUTO }
  fields:
    first:
      type: string
    last:
      type: string
  oneToMany:
      addresses:
        targetEntity: Address
        mappedBy: user

Address.orm.yml

  Home\DinnerBundle\Entity\Address:
  type: entity
  table: address
  id:
    id:
      type: integer
      generator: { strategy: AUTO }
  fields:
    id:
      type: integer
      nullable: true
    street_line:
      type: text
    city:
      type: string
    state:
      type: string
  manyToOne:
     user:
       targetEntity: User
       inversedBy: addresses
       joinColumn:
          name: user_id
          referencedColumnName: id

2 个答案:

答案 0 :(得分:0)

使用QueryBuilder,代码将是这样的:

$results = $em->getRepository('YourBundle:User')
                ->createQueryBuilder('user')
                ->join('user.address', 'address')
                ->where('address.city = :city_name')
                ->setParameter('city_name', "Berlin")
                ->getQuery()
                ->getResult();

注意:->setParameter('city_name', "Berlin") //仅适用于只有参数的情况,当您需要使用多个->setParameters(array('param_name' => $param_value, 'param_name_1' => $param_value_1))

文档为here

答案 1 :(得分:0)

为什么不使用实体管理器查询构建器? 它会自动为你加入的实体加水。

这是一段代码:

public function query(){
    $queryBuilder = $this->_em->createQueryBuilder();
    $queryBuilder->addSelect('user')
                ->join('user.address','address')
                ->where('address.city = :cityParameter')
                ->setParameter('cityParameter', 'Berlin');
    $query = $queryBuilder->getQuery();
    $result =  $query->getResult();

    return $result;
}