savemany - saveall cakephp 3
CakePHP saveAssociated no guarda HasMany a través de los datos del modelo (1)
En primer lugar, acerca de las funciones Guardar de Model ::, por ejemplo:
public function save($data = NULL, $validate = true, $fieldList = array()) {
$id = Post::find(''first'', array(
''fields'' => array(''id''),
''recursive'' => -1,
''conditions'' => array(''external_post_id'' => $data[''external_post_id''])
));
if( $id )
$data[''id''] = $id[''Post''][''id''];
pr($data);
return parent::save($data, $validate, $fieldList);
}
imprime $ datos de esta manera:
Array
(
[id] => 3 //for example 3
[Post] => Array
(
[external_post_id] => 12345
[sentiment_score] => 3.3
)
[URL] => Array
(
[url] => http://test.com
)
[Anchor] => Array
(
[anchor] => Test Anchor
)
)
estos $ datos son incorrectos, la información correcta es:
Array
(
[Post] => Array
(
[id] => 3 //for example 3
[external_post_id] => 12345
[sentiment_score] => 3.3
)
[URL] => Array
(
[url] => http://test.com
)
[Anchor] => Array
(
[anchor] => Test Anchor
)
)
Debe cambiar su función Modelo :: guardar de esta manera:
public function save($data = NULL, $validate = true, $fieldList = array()) {
$id = Post::find(''first'', array(
''fields'' => array(''id''),
''recursive'' => -1,
''conditions'' => array(''external_post_id'' => $data[''external_post_id''])
));
if( $id )
$data[$this->name][''id''] = $id[''Post''][''id''];
return parent::save($data, $validate, $fieldList);
}
segundo, no puede guardar esta información con solo guardar, debe guardar sus datos de esta manera:
$postData = array
(
''Post'' => array
(
''external_post_id'' => 12345
''sentiment_score'' => 3.3
)
);
$this->Post->save($data);
$postUrlId = $this->PostsUrl->find(''first'', array(
''conditions'' => array(
''post_id'' => $this->Post->id
),
''fields'' => array(''id'')
));
$urlAnchorData = array(
''URL'' => array
(
''url'' => ''http://test.com''
),
''Anchor'' => array
(
''anchor'' => ''Test Anchor''
),
''PostsUrl'' => array(
''id'' => $postUrlId[''PostsUrl''][''id'']
)
);
$this->PostsUrl->saveAll(''$urlAnchorData'');
Estoy tratando de obtener mis modelos asociados en CakePHP 2.3 para guardarlos correctamente, pero estoy teniendo problemas. Estoy almacenando publicaciones y quiero saber qué enlaces hay en esas publicaciones. Para cada uno de esos enlaces, me gustaría almacenar el texto de anclaje si está disponible. Mi base de datos está configurada como en el siguiente diagrama.
Diagrama de la base de datos http://derekperkins.com/wp-content/uploads/cakephp-database.png
Modelo de anclaje
class Anchor extends AppModel {
public $hasMany = array(
''PostsUrl'' => array(
''className'' => ''PostsUrl'',
''foreignKey'' => ''anchor_id'',
''dependent'' => false
)
);
public function save($data = NULL, $validate = true, $fieldList = array()) {
$id = Anchor::find(''first'', array(
''fields'' => array(''id''),
''recursive'' => -1,
''conditions'' => array(''anchor'' => $data[''anchor''])
));
if( $id )
$data[''id''] = $id[''Anchor''][''id''];
return parent::save($data, $validate, $fieldList);
}
}
Modelo de URL
class Url extends AppModel {
public $hasMany = array(
''PostsUrl'' => array(
''className'' => ''PostsUrl'',
''foreignKey'' => ''url_id'',
''dependent'' => false
)
);
public function save($data = NULL, $validate = true, $fieldList = array()) {
$id = Url::find(''first'', array(
''fields'' => array(''id''),
''recursive'' => -1,
''conditions'' => array(''url'' => $data[''url''])
));
if( $id )
$data[''id''] = $id[''Url''][''id''];
return parent::save($data, $validate, $fieldList);
}
}
Publicaciones Modelo de URI
class PostsUrl extends AppModel {
public $belongsTo = array(
''Post'' => array(
''className'' => ''Post'',
''foreignKey'' => ''post_id''
),
''Url'' => array(
''className'' => ''Url'',
''foreignKey'' => ''url_id''
''Anchor'' => array(
''className'' => ''Url'',
''foreignKey'' => ''anchor_id''
)*/
);
}
Modelo de publicación
class Post extends AppModel {
public $hasMany = array(
''PostsUrl'' => array(
''className'' => ''PostsUrl'',
''foreignKey'' => ''post_id'',
''dependent'' => false
)
);
public function save($data = NULL, $validate = true, $fieldList = array()) {
$id = Post::find(''first'', array(
''fields'' => array(''id''),
''recursive'' => -1,
''conditions'' => array(''external_post_id'' => $data[''external_post_id''])
));
if( $id )
$data[''id''] = $id[''Post''][''id''];
return parent::save($data, $validate, $fieldList);
}
}
Envío de datos
Creé un formulario para probar mi modelo. Este es el código que estoy usando para guardar la matriz creada por el formulario. Recibo un mensaje que dice que las cosas se guardaron correctamente, pero solo se guarda la publicación. Nada se ingresa en las otras tres tablas. También estoy usando DebugKit y ninguna llamada SQL hace referencia a ninguno de esos datos.
$this->Post->saveAssociated($this->request->data, array(''deep'' => true))
Array
(
[Post] => Array
(
[external_post_id] => 12345
[sentiment_score] => 3.3
)
[URL] => Array
(
[url] => http://test.com
)
[Anchor] => Array
(
[anchor] => Test Anchor
)
)
También intenté formatear mis matrices para tener la URL y el Anchor debajo de PostsUrl como subcampo, pero tampoco funcionó.
Mis funciones Model :: save están ahí para evitar que duplique datos, y funcionan correctamente en otros modelos que he usado en el pasado (aunque estoy abierto a sugerencias sobre una mejor manera de hacerlo, ya que esto utiliza una llamada a la base de datos para cada cheque). También intenté comentarlos, y no afecta mi código. ¿Cómo debería estructurar esto para ahorrar adecuadamente?