Как сделать где на объединенном столе?

У меня есть этот запрос

$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
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Было бы лучше, если бы вы могли указать сопоставление пользователя и компании в их сущностях, например, сделать это как доктрину, а в части соединения просто указать те свойства, которые сопоставлены с другой сущностью.

нравиться

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

У меня больше нет возможности сопоставить таблицу Company с таблицей User. Я уже пробовал ваше второе решение, но оно выдало ошибку line 0, col 83 near 'owners = u.id': Error: Invalid PathExpression. StateFieldPathExpression or SingleValuedAssociationField expected.

Dimitri Danilov 15.06.2018 00:34

@DimitriDanilov Пожалуйста, дважды проверьте, есть ли у вас собственность в компании с именем owners, также измените критерии соответствия, такие как 'u.id = c.owners', и введите ->from('AppBundle\Entity\User', 'u')

M Khalid Junaid 15.06.2018 00:47

Может быть, потому, что у владельцев собственности есть отношения manytoMany с таблицей company_owners?

Dimitri Danilov 15.06.2018 00:57

Можете ли вы включить в свой вопрос определения вашей сущности

M Khalid Junaid 15.06.2018 00:58

Да, я только что это сделал. Может быть, мне сначала присоединиться к company_owners, а затем присоединиться к компании? Но у меня нет юридического лица CompanyOwners

Dimitri Danilov 15.06.2018 01:09

@DimitriDanilov Нет, во многих ассоциациях вам не нужно указывать таблицу соединений (company_owners) в запросе, Doctrine позаботится об этой части, также см. Обновленный ответ

M Khalid Junaid 15.06.2018 01:16

Другие вопросы по теме