У меня есть этот запрос
$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, проверить, имеет ли эта таблица user_id ее владельца, и, если есть, найти имя поля таблицы Company и сравнить его с searchInput.
К сожалению, у меня такая ошибка:
[Syntax Error] line 0, col 242: Error: Expected end of string, got '.'
Есть идея, почему это происходит?
class Company implements CompanyModelInterface
{
//Other properties there
/**
* @var UserInterface[]
*/
protected $owners;
}
И мой .yml
manyToMany:
owners:
targetEntity: User
joinTable:
name: company_owners
schema: public
joinColumns:
company_id:
referencedColumnName: id
inverseJoinColumns:
user_id:
referencedColumnName: id
unique: true


Было бы лучше, если бы вы могли указать сопоставление пользователя и компании в их сущностях, например, сделать это как доктрину, а в части соединения просто указать те свойства, которые сопоставлены с другой сущностью.
нравиться
class User
{
/**
* @ORM\ManyToOne(targetEntity = "App\Entity\Company", inversedBy = "owners")
* @ORM\JoinColumn(nullable=false)
*/
private $company;
}
class Company
{
// ...
/**
* @ORM\OneToMany(targetEntity = "App\Entity\User", mappedBy = "company")
*/
private $owners;
}
Используя построитель запросов, вы можете написать как
$queryBuilder = $this->createQueryBuilder('u');
$queryBuilder->select('u')
->join('u.company', 'c');
->where('c.name LIKE :searchInput')
->setParameter('searchInput', "%" . strtolower($searchInput) . "%");
На данный момент, если вы не определили никаких сопоставлений и все еще хотите присоединиться к 2 объектам, вы можете использовать предложение 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) . "%");
Отображение отношений ManyToOne
Если вы используете базу данных Mysql на бэкэнде, я предлагаю вам установить сортировку таблиц как нечувствительную к регистру, чтобы вам не нужно было использовать функции LOWER/UPPER.
B.5.4.1 Чувствительность к регистру при поиске строки
Определите свои сопоставления как двунаправленные, как для определения пользователем как
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) . "%");
@DimitriDanilov Пожалуйста, дважды проверьте, есть ли у вас собственность в компании с именем owners, также измените критерии соответствия, такие как 'u.id = c.owners', и введите ->from('AppBundle\Entity\User', 'u')
Может быть, потому, что у владельцев собственности есть отношения manytoMany с таблицей company_owners?
Можете ли вы включить в свой вопрос определения вашей сущности
Да, я только что это сделал. Может быть, мне сначала присоединиться к company_owners, а затем присоединиться к компании? Но у меня нет юридического лица CompanyOwners
@DimitriDanilov Нет, во многих ассоциациях вам не нужно указывать таблицу соединений (company_owners) в запросе, Doctrine позаботится об этой части, также см. Обновленный ответ
У меня больше нет возможности сопоставить таблицу Company с таблицей User. Я уже пробовал ваше второе решение, но оно выдало ошибку
line 0, col 83 near 'owners = u.id': Error: Invalid PathExpression. StateFieldPathExpression or SingleValuedAssociationField expected.