Как передать массив в условие where? - PullRequest
1 голос
/ 19 июня 2020

У меня есть динамика c где условия. Они состоят из следующего массива:

array:2 [
  "brand_name" => array:2 [
    0 => "a"
    1 => "b"
  ]
  "category_type" => array:1 [
    0 => "AA"
  ]
]

Мне нужно применить условия where к моему запросу.

$em = $this->getEntityManager();
$sql = " select * from products as p";

$i = 0;
foreach ($wheres as $key => $value) {
    if ($i === 0) {
        $sql .= " WHERE";
    } else {
        $sql .= " AND";
    }
    $sql.= " te.$key IN (:$key)";
    $i +=1;
}

Я не уверен, как присвоить значение запросу. Если бы у меня было одно условие where, я сделал бы что-то вроде этого:

$params = array(
            $ids,
        );
        $query = $em->getConnection()->executeQuery(
            $sql,
            $params,
            array(
                \Doctrine\DBAL\Connection::PARAM_STR_ARRAY,
                \PDO::PARAM_INT,
            )
        );
        $records = $query->fetchAll();

Но я не знаю, как исправить, где where условия в динамике c.

1 Ответ

2 голосов
/ 19 июня 2020

Это очень просто с помощью конструктора запросов. Это то, для чего он был разработан.

Что-то вроде этого приведет вас туда:

$qb = $this->createQueryBuilder('p');

$suffix = 0;
foreach ($conditions as $key => $value) {
    $parameter = 'query_' . $suffix++;

    $qb->andWhere("p.$key IN :$parameter")
        ->setParamter($parameter, $value);
}

$records = $qb->getQuery()->getResult()

Вам нужно будет внести корректировки в соответствии с вашей моделью данных. В своем вопросе вы выбираете products as p, но затем вы пытаетесь выбрать из te, поэтому я предполагаю, что в головоломке отсутствуют некоторые части.

Но вы сможете завершить sh это отсюда.

...