2011-08-20 21 views
6

En Doctrine 1.2, es posible configurar Key Mapping para una tabla donde Doctrine_Collection objetos creados por esa tabla llenarán claves de una columna particular en cada registro en la colección.Configuración del atributo de asignación de clave Doctrine_Collection en schema.yml

Un ejemplo de la documentación ligada arriba:

Es posible que desee asignar la columna de nombre:

// test.php 

// ... 
$userTable = Doctrine_Core::getTable('User'); 

$userTable->setAttribute(Doctrine_Core::ATTR_COLL_KEY, 'username'); 

Ahora colecciones de usuarios utilizarán los valores de la columna nombre como índices de elementos:

// test.php 

// ... 
$users = $userTable->findAll(); 

foreach($users as $username => $user) { 
    echo $username . ' - ' . $user->created_at . "\n"; 
} 

¿Hay alguna manera de configurar esto en un sc archivo hema.yml?

Respuesta

5

bien la exploración de un problema similar, me encontré con this example:

--- 
User: 
    columns: 
    ... 
    attributes: 
    export: all 
    validate: true 

Aplicando el mismo principio con el atributo coll_key produce esto:

User: 
    columns: 
    ... 
    attributes: 
    coll_key: username 

podemos comprobar después de hacer una construir que el atributo fue aceptado:

$this->setAttribute(Doctrine_Core::ATTR_COLL_KEY, 'username'); 

Hay una advertencia, sin embargo.Usted tiene que crear explícitamente la columna que desea utilizar, o bien Doctrina generará un error durante el proceso de construcción:

User: 
    actAs: 
    Sluggable: ~ 
    columns: 
    ... 
    attributes: 
    coll_key: slug 
$ symfony doctrine:build --all --no-confirmation 
>> doctrine Dropping "doctrine" database 
>> doctrine Creating "dev" environment "doctrine" database 
>> doctrine generating model classes 
>> file+  /tmp/doctrine_schema_60681.yml 
    ... 
>> doctrine generating form classes 

    Couldn't set collection key attribute. No such field 'slug'.

Para conseguir lo anterior a trabajar, lo que tendría que especificar explícitamente el slug columna, aunque la plantilla Sluggable normalmente la crea automáticamente:

User: 
    actAs: 
    Sluggable: ~ 
    columns: 
    ... 
    slug: 
     type: string(50) 
     unique: true 
    attributes: 
    coll_key: slug 
0

Si es posible, no está bien documentado. Puede especificar opciones para una mesa en la definición de la tabla, like this Sabiendo que

const ATTR_COLL_KEY    = 108; 

me gustaría probar:

User: 
    options: 
    attr_coll_key: username 

continuación

User: 
    options: 
    attrCollKey: username 

o incluso

User: 
    options: 
    108: username 

No pude encontrar con precisión en qué parte del código se manejan las opciones, pero puede hacerlo con la depuración paso a paso de xdebug.

Buena suerte, y dígaselo a usar si uno de estos intentos funciona.

+0

Gracias por las sugerencias; ¡fueron un excelente punto de partida! Pude hacerlo funcionar al especificarlo como un atributo en lugar de una opción (ver mi respuesta para más información). –

+0

@Phoenix: no sabía que podría establecer atributos en el esquema, ¡gran trabajo! – greg0ire

Cuestiones relacionadas