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

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')
4

1 に答える 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 に答える