我对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')
答案 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查询中使用列时,列/字段名称必须与模型定义中的大小写匹配。