【问题标题】:Retrieveing the Query that Created a Doctrine_Collection检索创建学说集合的查询
【发布时间】:2011-03-10 20:50:00
【问题描述】:

我有一个 Doctrine_Collection 对象,它是用类似的代码创建的。

$collection = Doctrine_Query::create()
->from('FooBazBar')
->where('widget_id = ?',$some_var)
->execute();

没有写下来,是否可以检索用于创建集合的 where 子句?

也就是说,我希望能够像这样

$collection->getWhereClauses(); //fake method

然后以某种形式取回 where 子句。

一个明确的“不,这不是通过 API 公开的”并解释是一个完全合理的答案。

【问题讨论】:

    标签: php reflection orm doctrine introspection


    【解决方案1】:

    【讨论】:

    • 这将使我获得 query 对象的 sql。我有一个来自对查询对象调用 execue 的集合。我想获取用于生成查询的原始 sql。
    • 这就是重点,不要调用 execute() 只需构建 DQL,然后从 getSqlQuery 调用中构建 var_dump()。这将为您提供查询,因为它将被执行。
    • 对,但您假设我是 Doctrine_Collection 实例化的控制器中的一个。不过,我很感激这些信息!
    【解决方案2】:

    不,这不会通过 API 公开。

    更严重的是,您无法检索生成 Doctrine_Collection 的查询。执行此操作的简单方法是在表中创建一个方法,例如:

    //FooTable.php
    public function findByWidgetQuery()
    {
    return $this->createQuery('foo')
      ->where('foo.baz = ?', 'bar');
    }
    

    然后你可以像这样使用 getDqlPart() :

    $where = Doctrine_Core::getTable('Foo')
    ->findByWidgetQuery()
    ->getDqlPart('where');
    

    这应该给你一个像这样的数组:

    array(2) { [0] => string(8) 'widget = ?' [1] => string(10) 'widget = ?' }
    

    请注意,它不会返回传递给 where() 子句的实际值。为此,您需要使用 Doctrine_Query::getParams() 或 Doctrine_Query::getFlattenedParams()

    您可以在Doctrine API 中找到所有内容。

    【讨论】:

    • 我的想法是什么,但对于深层对象层次结构,永远不知道。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-07-03
    • 2011-08-03
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 2015-03-21
    相关资源
    最近更新 更多