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) . "%");