2012-09-20 2 views
2

Doctrine 버전 1.1.0에서 열 이름의 대소 문자에 문제가 있습니다. 또한, MySQL 데이터베이스 테이블에서Doctrine 1.1의 대문자 열 이름과의 이상한 동작으로 인해 예외가 발생했습니다.

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... 
    } 
} 

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

그래서 어디서나 교리 연결의 경우 속성을 설정하지 않은 기본값 (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

당신이 당신의 모델에 정의 된 것을 동일하게해야합니다 데이터베이스에서 선택하려는 필드의 이름입니다. 대소 문자를 구분합니다.

자세한 내용은 here에서 확인할 수 있습니다. 첫 번째 부분은 "칼럼"에 대해 이야기하고 설명합니다.

One problem with database compatibility is that many databases differ in their behavior of how the result set of a query is returned. MySQL leaves the field names unchanged, which means if you issue a query of the form "SELECT myField FROM ..." then the result set will contain the field myField.

Unfortunately, this is just the way MySQL and some other databases do it. Postgres for example returns all field names in lowercase whilst Oracle returns all field names in uppercase. “So what? In what way does this influence me when using Doctrine?”, you may ask. Fortunately, you don’t have to bother about that issue at all.

Doctrine takes care of this problem transparently. That means if you define a derived Record class and define a field called myField you will always access it through $record->myField (or $record['myField'], whatever you prefer) no matter whether you’re using MySQL or Postgres or Oracle etc.

In short: You can name your fields however you want, using under_scores, camelCase or whatever you prefer.

NOTE: In Doctrine columns and column aliases are case sensitive. So when you are using columns in your DQL queries, the column/field names must match the case in your model definition.

+0

무엇에 관한 것입니까? 제가 게시 한 링크를 읽을 수 있습니다. – Guido

+1

혼자서는 의미가 없으므로 대상 자원이 앞으로는 보장되지 않으므로 혼자있는 링크는 [잘못된 대답으로 간주됩니다] (http://stackoverflow.com/faq#deletion)입니다. [여기에 대답의 핵심 부분을 포함하고 참조 용 링크를 제공하는 것이 바람직합니다 (답을 편집 할 때처럼). – j0k

+1

고마워요! 미안, 내 실수! 그러나 나는 모델의 이름이 그의 선고문에서 동일해야한다는 것이 필수적이라고 쓰고 있다고 생각한다. 그럼 난 더 많은 참조를위한 링크를 넣어 – Guido