使用Doctrine 1.1中的大写Column Name导致异常的奇怪行为

时间:2012-09-20 08:09:19

标签: php mysql doctrine case-sensitive

我对Doctrine版本1.1.0中的列名称有疑问。

我有一个带有此定义的记录(实体):

abstract class BaseProductsXsell extends Doctrine_Record
{
    public function setTableDefinition()
    {
        $this->setTableName('products_xsell');
        $this->hasColumn('ID', 'integer', 4, array('type' => 'integer', 'length' => 4, 'primary' => true, 'autoincrement' => true));
        $this->hasColumn('products_id', 'integer', 4, array('type' => 'integer', 'length' => 4, 'unsigned' => 1, 'default' => '1', 'notnull' => true));
        // and so on...
    }
}

在MySQL数据库表中,“ID”的列名也是大写。 但是当我尝试在查询后使用以下方法获取列名称时<:p>

$query = Doctrine_Query::create()->select('m.*')->from("ProductsXsell m");
$collection = $query->execute();
$columns = $collection->getTable()->getColumnNames();
print_r($columns);

输出如下:

Array
(
    [0] => id
    [1] => products_id
    ...
)

我没有在任何地方设置doctrine连接的case属性,所以它应该是默认值(Doctrine :: CASE_NATURAL)。

这会导致以下错误:

Fatal error: Uncaught exception 'Doctrine_Record_UnknownPropertyException' with message 'Unknown record property / related component "id" on "ProductsXsell"' in /opt/hocatec/bin/libs/Doctrine/Doctrine/Record/Filter/Standard.php:55
Stack trace:
#0 /opt/hocatec/bin/libs/Doctrine/Doctrine/Record.php(1282): Doctrine_Record_Filter_Standard->filterGet(Object(ProductsXsell), 'id')
#1 /opt/hocatec/bin/libs/Doctrine/Doctrine/Record.php(1240): Doctrine_Record->_get('id', true)
#2 /opt/hocatec/bin/libs/Doctrine/Doctrine/Access.php(117): Doctrine_Record->get('id')
#3 /opt/hocatec/bin/models/HocaSync.php(368): Doctrine_Access->offsetGet('id')

1 个答案:

答案 0 :(得分:1)

要从数据库中选择的字段名称必须与模型中定义的名称相同。区分大小写。

您可以阅读有关此here的更多信息。第一部分讨论“专栏”并解释。

  

数据库兼容性的一个问题是许多数据库不同   在他们如何返回查询的结果集的行为。 MySQL的   保持字段名称不变,这意味着如果您发出查询   表单“SELECT myField FROM ...”然后结果集将包含   字段myField。

     

不幸的是,这只是MySQL和其他一些数据库的方式   它。例如,Postgres以小写形式返回所有字段名称   Oracle以大写形式返回所有字段名称。 “所以呢?以什么方式   在使用Doctrine时这会影响我吗?“,你可能会问。   幸运的是,你根本不必担心这个问题。

     

Doctrine透明地处理这个问题。这意味着如果你   定义派生的Record类并定义一个名为myField的字段   将始终通过$ record-&gt; myField(或$ record ['myField']访问它,   无论你喜欢什么,无论你是使用MySQL还是Postgres   或Oracle等。

     

简而言之:您可以使用您想要的字段命名   under_scores,camelCase或任何你喜欢的。

     

注意:在Doctrine列中,列别名区分大小写。因此,当您在DQL查询中使用列时,列/字段名称必须与模型定义中的大小写匹配。