首页 > 解决方案 > 表单可以返回不同数量的值,尝试在学说查询中使用返回的值

问题描述

我在数据库中保存了一堆解析的消息,我希望能够根据用户输入提取结果。我想按 1-4 个值(稍后会有更多选项)、用户名、ID、电子邮件或日期和时间进行排序。我一直在使用教义来做我的其他查询,但是这个,我就是想不通。

我的问题是,我不知道如何检查哪些值被传递到方法中并且只查询这些值。

例如:

用户在用户名中输入“bob”,在电子邮件字段中输入“bob@example.com”。对于这种情况,我需要教义看起来像这样:

$queryBuilder
            ->select('*')
            ->from('m2m_messages')
            ->where('username = ' . $queryBuilder->createNamedParameter($params[username]))
            ->andWhere('email = ' . $queryBuilder->createNamedParameter($params[email]))
        $query = $queryBuilder->execute();

但我希望它改变,而不是为每个场合单独创建所有副本......如果我想指定 ID 和电子邮件,它应该只采用这些值。

我通过一个数组传递值,该数组只包含我需要在 sql 中使用的搜索词。对于上面的示例,它看起来像这样:

$params [
    username => 'bob',
    email => 'bob@example.com'
]

我还没有找到一种在我的代码中实现 if(isset) 的方法,它允许我自动只使用我传递给方法的值。

我的目标是能够在任意数量的字段中输入详细信息,输入的值在数组中传递,并且它们的任何组合都被接受并制作到 sql 脚本中,而无需单独编写 20 多个不同的 sql 脚本。

标签: phpsqldoctrinemariadb

解决方案


像这样的东西?

$queryBuilder
    ->select('*')
    ->from('m2m_messages');

if (count($params) > 0) {
    $isFirst = true;
    foreach ($params as $paramKey => $paramValue) {
        if ($isFirst) {
            $queryBuilder->where(sprintf('%1$s = %2$s', $paramKey, $queryBuilder->createNamedParameter($paramValue)));
            $isFirst = false;
        } else {
            $queryBuilder->andWhere(sprintf('%1$s = %2$s', $paramKey, $queryBuilder->createNamedParameter($paramValue)));
        }
    }
}
$query = $queryBuilder->execute();

这个概念是遍历您的参数并添加 where 提供的条件$params


推荐阅读