具有动态列的createQueryBuilder

时间:2019-10-07 22:39:28

标签: php symfony doctrine-orm symfony4

我想使用其他表中的动态列来自定义查询。

这是我尝试过的:

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不匹配。如果是这样,我该怎么做?如果没有,请告诉我我在做什么错。

0 个答案:

没有答案