2011-06-14 27 views
6

¿Cómo configuro aparatos con relaciones en Yii? Por ejemplo, con las publicaciones pueden tener comentarios, ¿cómo me refiero a la identificación de la publicación en un accesorio para crear comentarios?Accesorios relacionales en Yii

Mensaje accesorio:

return array(
    'post1'=>array(
    'title'=>'My title', 
    'body'=>'My text', 
), 
    ... 

comentario accesorio:

return array(
    'comment1'=>array(
    'text'=>'Comment text...', 
    'post_id'=> ??? 
), 
+0

¿Estamos hablando de consultas relacionales aquí? –

+0

¿Realmente no? Solo quiero crear aparatos (para pruebas unitarias) que tengan relaciones como las del sistema de producción. –

+0

Mi mal. Lo investigaré, señor. –

Respuesta

5

No sé si hay una manera dinámica para hacer eso, pero el siguiente debería funcionar:

Mensaje accesorio:

return array(
    'post1' => array(
    'id' => 1 
    'title' => 'My title', 
    'body' => 'My text', 
), 

comentario accesorio:

return array(
    'comment1' => array(
    'text' => 'Comment text...', 
    'post_id' => 1 
), 
+0

En caso de que alguien se esté preguntando, esto sí funciona - ** a pesar de la documentación que menciona que los campos '' 'id''' se generan dinámicamente y que no se configuran.** –

+0

Como el orden en el que se cargan los dispositivos está determinado por aquél en el que el comando php readdir lista los archivos del dispositivo, * puede ser necesario deshabilitar temporalmente las restricciones de clave externa *. – clapas

4

Por lo que yo he trabajado a cabo, puede utilizar los scripts de inicio en lugar de los accesorios clásicos. El Yii documentation lee:

También es posible que no nos gusta la forma predeterminada de restablecer una mesa , es decir, truncándolo e insertándolo con los datos del accesorio. Si es este es el caso, podemos escribir un script de inicialización para el archivo de dispositivo específico . La secuencia de comandos debe nombrarse como el nombre de tabla con sufijo .init.php. Por ejemplo, el script de inicialización para Post table sería Post.init.php. Cuando CDbFixtureManager ve este script, ejecutará este script en lugar de usar la forma predeterminada para restablecer la tabla.

Así, en su caso, en lugar de tener protected/tests/fixtures/Comment.php, se habría protected/tests/fixtures/Comment.init.php que hace esto:

// the $this variable refers to the CBdFixtureManager instance 
$this->truncateTable($tableName); 
$post = $this->getRecord('Post','post1'); // get dependent fixture 

// define new fixture 
$commentAttributes = array(
    'text' => 'Comment text...', 
    'post_id' => $post->id 
); 
$comment = new Comment; 
$comment->setAttributes($commentAttributes); 
if(!$comment->save()) throw new CException('Unable to save fixture'); 

// add new row primary key 
$pk = Comment::model()->getTableSchema()->primaryKey; 
if(is_string($pk)) 
    $commentAttributes[$pk] = $comment->$pk; 
elseif(is_array($pk)) 
    foreach($pk as $key) 
    $commentAttributes[$key] = $comment->$key; 

$this->_rows['Comment']['comment1'] = $commentAttributes; 
$this->_records['Comment']['comment1'] = 'Comment'; 

Aunque me doy cuenta de que es una respuesta muy tarde, que debe arreglar el problema. Desde que llegué aquí a buscar en Google, esperaba poder ayudar a alguien más que necesita esta información.

+0

¡Gracias por su respuesta, incluso con el retraso de tiempo! Espero que ayude a alguien en el futuro. –

2

Sé que ya está respondida, pero creo que esta es una mejor respuesta. Sí, puede usar campos dinámicos para las relaciones:

Mensaje accesorio:

return array(
    'post1' => array(
    'title' => 'My title', 
    'body' => 'My text', 
), 

comentario accesorio:

return array(
    'comment1' => array(
    'text' => 'Comment text...', 
    'post_id' => $this->getRecord('post', 'post1')->id 
), 

PostTest.php

public $fixtures=array(
    'post'=>'Post', 
    ... 
); 

docs Yii CDbFixtureManager

+0

Lo intenté pero no funcionó, ¿hay algo diferente que tengo que hacer en bootstrap o config? Los _registros en cdbFixtureManager siempre son nulos para mí – FabioCosta

+0

¿Qué es "_records"? ¿Funciona con la identificación codificada? De lo contrario, no está relacionado con mi respuesta y debería buscar ayuda para crear pruebas y accesorios. Sugerencia: creo que el orden en la matriz $ fixture es importante, así que asegúrese de que la tabla maestra esté incluida primero (aquí 'post' es el primer elemento en $ fixtures y 'comment' debe seguir). – kcsoft

+0

No se requiere otra configuración además de la que se usa cuando se usan identificadores codificados. Supongo que has escrito mal algo. Por ejemplo, cdbFixtureManager no tiene ningún método de "getRecords". Tiene "getRecord" y debería devolver un objeto ActiveRecord. Tal vez haya utilizado el "-> id" para obtener la identificación, pero debe coincidir con la identificación de su modelo. – kcsoft