Doctrine QueryBuilder 未定义 getQuery() 方法

3
当我执行方法getMachineSettings时,出现错误:

致命错误:未捕获的错误:调用未定义的方法Doctrine \ DBAL \ Query \ QueryBuilder :: getQuery()

$data是一个关联数组:
$data['param'] = 'ip';
$data['value'] = '192.168.240.10';

如果我将getQuery()->getResult()替换为execute()$result将包含以下查询语句:SELECT * FROM machine WHERE ip = ?
public function __construct()
{

    try
    {

        $dbconf = parse_ini_file('.htLogin.ini');
        $config = new \Doctrine\DBAL\Configuration();

        $connectionParams = array
            (
                'dbname'    => $dbconf['infoDb'],
                'user'      => $dbconf['infoLogin'],
                'password'  => $dbconf['infoPw'],
                'host'      => $dbconf['infoHost'],
                'driver'    => 'pdo_mysql',
                'charset'   => 'utf8',
                'driverOptions' => array
                    (
                        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
                    )

            );
        $this->mysql = \Doctrine\DBAL\DriverManager::getConnection($connectionParams, $config);

    }
    catch(PDOException $e)
    {

        echo $e -> getMessage();

    }


public function getMachineSettings($data)
{
    $qb = $this->mysql->createQueryBuilder();
    $qb->SELECT('*')
       ->FROM('`machine`')
       ->WHERE($data['param'] . ' = :value');
    $qb->setParameters(
            array
            (
                ':value' => $data['value']
            )
        );

    $results = $qb->getQuery()->getResult();


    var_dump($result);

    return $result;

 }

你有没有想过为什么getQuery()方法无法识别?


1
$this->mysql 是什么? - Manse
ManseUK - 很好的问题 :) 我想看到完整的代码 - Krzysztof Raciniewski
@ManseUK 我更新了问题,加入了 $this->mysql。 - Angel115
@Angel115 更新了我的回答 - $results = $qb->execute->fetchAll(); - Manse
1个回答

7

只需要执行

$results = $qb->execute()->fetchAll();

请忽略下面的内容 - 它假设您正在使用Doctrine ORM,但实际不是

您遇到的问题是,您使用的 QueryBuilder 对象不是Doctrine ORM QueryBuilder,而是DBAL QueryBuilder。

您需要使用 EntityManager 中的 createQueryBuilder 函数。

/** @var Doctrine\ORM\QueryBuilder $qb */
$qb = $this->entityManager->createQueryBuilder();

然后您可以使用 select / from 等方法来获取查询结果,您可以运行以下命令:

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

如果我要重新编写你的函数,我会这样写:
public function getMachineSettings(string $field, string $value)
{
    $qb = $this->entityManager->createQueryBuilder();
    $qb->select('m')
       ->from('machine')
       ->where($field.' = :value');
    $qb->setParameter('value', $value);
    $results = $qb->getQuery()->getResult();
    var_dump($result);
    return $result;
}

那么您知道该函数需要2个参数才能正常运行,传递一个数组并不能让您立即看到该函数所需的参数。


2
$results = $qb->execute()->fetchAll(); 运行得非常好。非常感谢您的时间,ManuseUK。 - Angel115

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接