createQueryBuilder с динамическими столбцами - PullRequest
0 голосов
/ 08 октября 2019

Я бы хотел настроить свой запрос с помощью динамических столбцов из других таблиц.

Это то, что я пробовал:

public function matchWithArray($select, $where, $value, array $optionalColumns, array $optionalValues) {
    $query = null;
    if (!empty($optionalColumns)) {

        // Select
        $query = $this->createQueryBuilder('p')->select($select);

        // Use (multiple) inner joins, based on the arrays
        for ($i = 0;  $i < count($optionalColumns); $i++) {
            $join = $this->helper->getTableName(array_values($optionalColumns)[$i]);
            $query = $query->innerJoin("App\Entity\\$join", $join);
        }

        // Where
        $query = $query->where('p.' . $where  . ' = :where');

        // Use (multiple) andWhere clauses
        for ($i = 0;  $i < count($optionalColumns); $i++) {
            $prefix = $this->helper->getTableName(array_values($optionalColumns)[$i]);
            $query = $query->andWhere("$prefix.$optionalColumns[$i] = :value$i")->setParameter("value$i", $optionalValues[$i]);
        }

        // Rest of the query
        $query = $query
            ->setParameter('where', $value)
            ->getQuery()
            ->getResult()
            ;
    }
    return $query;
}

Вот как я его называю: $this->matchWithArray('p.uid', 'p.city', 'Chicago', ['language'], ['english'])

Теперь возвращаются только пользователи из Чикаго, но должны возвращаться пользователи из Чикаго И говорят по-английски.

Мои таблицы выглядят так:

Личные

| ID   | UID |   City   |
|------|:---:|---------:|
| 1    |  1  | Zurich   |
| 2    |  2  | Chicago  |
| 3    |  3  | Chicago  |

Языки

| ID   | UID | Language   |
|------|:---:|-----------:|
| 1    |  2  | English    |
| 2    |  3  | English    |
| 3    |  1  | German     |

Я не уверен, но я думаю, что я делаю неправильно, что я не соответствую UID,Если так, как я могу это сделать? Если нет, пожалуйста, скажите мне, что я делаю неправильно.

...