3

我有下表

Test:
    tableName: test
    columns:
        test_id:
            name: test_id as id
            primary: true
            autoincrement: true
            type: integer
            notnull: true
        test_name:
            name: test_name as name
            type: string(255)
        test_title:
            name: test_title as title
            type: string(255)

和这个 dql 声明

$dql = Doctrine_Query::create()->select('t.name')->from('Model_Test t');

生成以下 sql ist

SELECT t.test_id AS t__test_id, t.test_name AS t__test_name FROM test t

但是在学说中获取结果后,即使未选择标题字段,我也可以访问它:

foreach ($results as $result) {
    foreach ($result as $filed => $value) {
        echo "$filed => $value <hr>"; // echoes 'title' => null but title in db has other value
    }                                
}                                

也通过 Zend_Debug::dump($results->toArray()); 转储 向我显示所有字段,就好像我会选择 *

那么如何限制返回的字段以匹配我的选择呢?

提前致谢

马丁

4

3 回答 3

3

我猜:

因为

$results = $dql->execute();

将结果作为对象获取,未选择的变量用空值填充

然而

$results = $dql->fetchArray(); 

获取一个数组,在这种情况下,只显示选定的字段(除了主键)

于 2010-11-23T05:35:53.687 回答
1

这个对我有用,只获取查询的字段:

$events = Doctrine_Query::create()
     ->select("e.id, e.Title, e.Lat, e.Lon, e.Startdate, e.Location, e.Url")
     ->from('Event e')
     ->setHydrationMode(Doctrine::HYDRATE_ARRAY)
     ->execute();

结果数组将仅包含选定的字段

于 2012-04-01T11:30:46.033 回答
0

我不确定,但我认为教义只选择idand name,但是当您尝试访问title它时,会发现它title不是从数据库中获取的。因此,学说重新获取该对象(仅这次使用SELECT *或类似的查询)。

如果您有某种 Doctrine 查询分析器——您可能会看到 foreach 循环中所需的所有其他查询。

顺便说一句,只是一个疯狂的问题......

哦,$query->execute(Doctrine::HYDRATE_ARRAY)如果您只想选择部分字段,则可以使用。

于 2010-11-22T20:32:47.953 回答