我可以在Symfony / ORM中搜索实体的子属性吗?

时间:2015-11-21 03:22:11

标签: symfony search doctrine-orm

我正在为我的公司实体创建搜索功能,并使用Symfony 2和Doctrine ORM将我的逻辑放在自定义实体存储库中。

公司实体具有子集合位置,因为公司可以有多个位置,以及公司名称字段。

我想知道是否可以使用查询构建器按公司名称和位置[1]。地址,位置[2]。地址等进行搜索。

这是我到目前为止所找不到的好资源。

trait ZealousNode extends ScrumptiousTypes.Node

看起来这不起作用:

*/ AppBundle/Repository/CompanyRepository.php */

class CompanyRepository extends EntityRepository
{

    public function findBySearch($options)
    {
        $query = $this->createQueryBuilder('c');

        foreach ($options as $key => $value) {
            $query->where('c.' . $key . ' LIKE :' . $key);
            $query->setParameter($key, '%' . $value . '%');
        }

        return $query->getQuery()->getResult();
    }
}

findBySearch()中$ options参数的一个例子是:

 $query->where('c.locations.city LIKE $city);

非常感谢任何有关资源的建议或链接。

2 个答案:

答案 0 :(得分:1)

您选择了c,之后您想要找到某个位置的公司,这意味着您应该在公司实体中使用(类型位置)字段location。位置实体shoud有field(string)city。公司实体中的字段位置应具有带有LocationEntity的oneToMany association。之后,当您添加公司名称时,您还将添加公司的位置。现在你可以写:

$query->leftJoin('c.locations', 'locations');
$query->where('locations.city LIKE :city');
$query->setParameter('city', '%'.$city.'%')

如果你想使用location对象的c.locations.city属性,你应该调用那里的关联。像leftJoin, innerJoin一样。但我认为innerJoin这里会更好,只需要两行。

$query->innerJoin('c.locations', 'locations', 'WITH', 'locations.city LIKE (:city)')
$query->setParameter('city', '%'.$city.'%')

答案 1 :(得分:0)

尝试将$query->where更改为$query->andWhere

->andWhere()可以直接使用,没有任何 - >

之前的where()