2

我对 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”的列名也是大写的。但是当我尝试在查询后获取列名时:

$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
    ...
)

我没有在任何地方设置学说连接的 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')
4

1 回答 1

1

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

您可以在此处阅读有关此内容的更多信息。第一部分谈论“列”并解释。

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

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

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

简而言之:您可以使用 under_scores、camelCase 或任何您喜欢的名称来命名您的字段。

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

于 2013-01-18T19:44:26.360 回答