Sql 如何在连接的表上执行where操作?

Sql 如何在连接的表上执行where操作?,sql,symfony,doctrine-orm,Sql,Symfony,Doctrine Orm,我有这个疑问 $queryBuilder = $this->createQueryBuilder('u'); $queryBuilder->select('u') ->join('AppBundle\Entity\Company', 'c'); ->where('c.owners = :u.id', 'LOWER(c.name) LIKE :searchInput') ->setParameter('searchInput', "%" .

我有这个疑问

$queryBuilder = $this->createQueryBuilder('u');

$queryBuilder->select('u')
    ->join('AppBundle\Entity\Company', 'c');
    ->where('c.owners = :u.id', 'LOWER(c.name) LIKE :searchInput')
    ->setParameter('searchInput', "%" . strtolower($searchInput) . "%");
此查询的目标是查找表Compagny,检查此表的所有者是否具有用户id,如果有,则搜索表公司的字段名并将其与searchInput进行比较

不幸的是,我有这个错误:

[Syntax Error] line 0, col 242: Error: Expected end of string, got '.'
你知道为什么会这样吗

class Company implements CompanyModelInterface
{
    //Other properties there

    /**
     * @var UserInterface[]
     */
    protected $owners;
}
还有我的

manyToMany:
    owners:
      targetEntity: User
      joinTable:
        name: company_owners
        schema: public
        joinColumns:
          company_id:
            referencedColumnName: id
        inverseJoinColumns:
          user_id:
            referencedColumnName: id
            unique: true

如果您可以指定用户和公司在其实体中的映射(如按原则方式进行映射),并且在连接部分中仅引用映射到另一个实体的那些属性,那就更好了

使用查询生成器,您可以编写为

$queryBuilder = $this->createQueryBuilder('u');
$queryBuilder->select('u')
    ->join('u.company', 'c');
    ->where('c.name LIKE :searchInput')
    ->setParameter('searchInput', "%" . strtolower($searchInput) . "%");
现在,如果您还没有定义任何映射,并且仍然希望连接两个实体,那么可以使用
WITH
子句

$queryBuilder = $this->createQueryBuilder('u');

$queryBuilder->select('u')
    ->join('AppBundle\Entity\Company', 'c', 'WITH', 'c.owners = u.id');
    ->where('c.name LIKE :searchInput')
    ->setParameter('searchInput', "%" . strtolower($searchInput) . "%");

如果您在后端使用Mysql数据库,我建议您将表排序设置为不区分大小写,这样您就不需要使用
LOWER/UPPER
函数

将映射定义为双向的,就像用户定义为

User:
  type: entity
  manyToMany:
    companies:
      targetEntity: Company
      mappedBy: owners
作伴

manyToMany:
    owners:
      targetEntity: User
      inversedBy: companies
      joinTable:
        name: company_owners
        schema: public
        joinColumns:
          company_id:
            referencedColumnName: id
        inverseJoinColumns:
          user_id:
            referencedColumnName: id
            unique: true
然后你就可以写成

$queryBuilder = $this->createQueryBuilder('u');
$queryBuilder->select('u')
    ->join('u.companies', 'c');
    ->where('c.name LIKE :searchInput')
    ->setParameter('searchInput', "%" . strtolower($searchInput) . "%");

我再也不可能将公司表映射到用户表。我已经尝试了您的第二个解决方案,但它在“owners=u.id”附近的第83列第0行给出了错误:错误:无效的PathExpression。应为StateFieldPathExpression或SingleValuedAssociationField。@DimitriDanilov请仔细检查公司实体中是否有名为
所有者的属性
,同时反转匹配条件,如
'u.id=c.owners'
,并从('AppBundle\entity\User',u')引入
->
可能是因为物业所有者与表公司所有者有着千丝万缕的关系吗?你能在你的问题中包含你的实体定义吗?是的,我刚才做了。我应该先加入公司,然后再加入公司吗?但我没有实体公司所有者
$queryBuilder = $this->createQueryBuilder('u');
$queryBuilder->select('u')
    ->join('u.companies', 'c');
    ->where('c.name LIKE :searchInput')
    ->setParameter('searchInput', "%" . strtolower($searchInput) . "%");