autorender - this fetch cakephp
CakePHP no usa mis modelos (5)
Tengo estos dos modelos de CakePHP V 2.4.5:
class Owner extends AppModel {
public $name = ''Owner'';
public $hasMany = array(''Car'');
}
y
class Car extends AppModel {
public $name = ''Car'';
public $belongsTo = array(''Owner'');
}
en mi controlador, escribí:
var $uses = array(''Owner'', ''Car'');
public function test(){
$data = array(
''Owner'' => array(
''name'' => ''Me''
),
''Car'' => array(
array(''color'' => ''red''),
array(''color'' => ''blue'')
)
);
$this->Owner->saveAssociated($data, array(''deep'' => true));
}
Pero CakePHP creó el propietario y se olvida de crear sus automóviles:
1 BEGIN
2 INSERT INTO `test`.`owners` (`name`) VALUES (''Me'')
3 COMMIT
Así es como se ve mi ERM:
¿Por qué CakePHP no guarda los autos?
¿Puedes por favor probar esto?
$this->Owner->saveAll($data);
En lugar de
$this->Owner->saveAssociated($data, array(''deep'' => true));
Gracias
He probado tu código.
Funciona perfecto.
Intenta eliminar la caché de modelos en la carpeta / tmp / cache
Mis resultados:
(default) 3 queries took 0 ms Nr Query Error Affected Num. rows Took (ms)
1 BEGIN 0 0 0
2 INSERT INTO `intranet`.`owners` (`name`) VALUES (''Me'') 1 1 0
3 INSERT INTO `intranet`.`cars` (`owner_id`, `color`) VALUES (3, ''red'') 1 1 0
4 INSERT INTO `intranet`.`cars` (`owner_id`, `color`) VALUES (3, ''blue'') 1 1 0
5 COMMIT 1 1 0
No es una respuesta real, pero acabo de probar tu código y también funciona para mí. (Pastel 2.4.5)
(default) 5 queries took 2 ms
Nr Query Error Affected Num. rows Took (ms)
1 BEGIN 0 0 0
2 INSERT INTO `cake_test_2`.`owners` (`name`, `updated`, `created`) VALUES (''Me'', ''2014-02-24 00:57:11'', ''2014-02-24 00:57:11'') 1 1 0
3 INSERT INTO `cake_test_2`.`cars` (`owner_id`, `color`) VALUES (1, ''red'') 1 1 0
4 INSERT INTO `cake_test_2`.`cars` (`owner_id`, `color`) VALUES (1, ''blue'') 1 1 1
5 COMMIT 1 1 1
Si intenta con una nueva instancia de CakePHP solo con estos modelos necesarios y el controlador ¿todavía no funciona?
Nota: Para que las transacciones funcionen correctamente en MySQL, sus tablas deben usar el motor InnoDB. Recuerde que las tablas MyISAM no admiten transacciones.
No es posible dar una respuesta que funcione directamente porque: No hay nada de malo con el código en la pregunta. Eso probablemente significa que no está ejecutando su propio código en absoluto.
Dado que la única respuesta que se puede dar es asesoramiento, la única clase que importa para el ejemplo en la pregunta es Owner
.
Verificar nombres de archivo
Las convenciones modelo son:
La clase de clase OptionValue se encontraría en un archivo llamado OptionValue.php
Los archivos de modelos con nombres incorrectos son, con mucho, la causa más común de las preguntas "¿por qué no se ejecuta mi lógica de modelo?". Un inconveniente es agregar el sufijo Model.php
a los archivos de modelo, ¿el nombre del archivo modelo es correcto?
En este caso, compruebe que exista la app/Model/Owner.php
archivo app/Model/Owner.php
.
Verifique que el modelo sea su modelo
Si está seguro de que el nombre del archivo modelo es correcto, verifique qué está usando la aplicación :
debug(get_class($this->Owner));
########## DEBUG ##########
''Owner''
###########################
Si el resultado es "AppModel", el archivo de modelo no está cargado. Hay muy pocas razones por las que CakePHP no usará un archivo que existe y se aplicará uno de ellos:
- El archivo no existe; hay un error tipográfico en el nombre
- La aplicación no está buscando en el mismo directorio que está
- La aplicación no tiene permiso para abrir el archivo
Verificar que la asociación exista
debug($this->Owner->hasMany);
########## DEBUG ##########
array(
''Car'' => array(
''className'' => ''Car'',
''foreignKey'' => ''owner_id'',
''conditions'' => '''',
''fields'' => '''',
''order'' => '''',
''limit'' => '''',
''offset'' => '''',
''dependent'' => '''',
''exclusive'' => '''',
''finderQuery'' => '''',
''counterQuery'' => ''''
)
)
###########################
Si Car
no está en la salida, la asociación no se guarda porque para que no exista, tendrá que identificar por qué.
Verifique qué archivos están cargados
En caso de duda, verifique qué archivos se cargan en tiempo de ejecución:
debug(get_included_files());
########## DEBUG ##########
array(
...
...app/Model/Owner.php
...
)
###########################
Esto puede indicar que se está cargando un archivo diferente , lo que impide que la app/Model/Owner.php
se cargue.
Usa una prueba para verificar lo que está sucediendo
Puede usar un caso de prueba para ayudar a la depuración, por ejemplo:
<?php
App::uses(''Owner'', ''Model'');
class OwnerTest extends CakeTestCase {
public $fixtures = array(
''app.car'',
''app.owner'',
);
public function setUp() {
parent::setUp();
$this->Owner = ClassRegistry::init(''Owner'');
}
public function tearDown() {
unset($this->Owner);
parent::tearDown();
}
public function testCreate() {
$data = array(
''Owner'' => array(
''name'' => ''Me''
),
''Car'' => array(
array(
''Car'' => array(
''color'' => ''red'',
)
),
array(
''color'' => ''blue'',
)
)
);
$this->assertSame(''Owner'', get_class($this->Owner));
$this->Owner->getDatasource()->getLog();
$this->Owner->saveAssociated($data);
$log = $this->Owner->getDatasource()->getLog();
$expected = array();
$this->assertSame($expected, $log, ''Look ma, the sql log'');
}
}
Que debería salir:
-> Console/cake test Test/Case/Model/OwnerTest.php
Welcome to CakePHP v2.4.5 Console
---------------------------------------------------------------
App : app
Path: /var/www/files.dev/htdocs/app/
---------------------------------------------------------------
CakePHP Test Shell
---------------------------------------------------------------
PHPUnit 3.7.24 by Sebastian Bergmann.
F
Time: 169 ms, Memory: 9.00Mb
There was 1 failure:
1) OwnerTest::testCreate
Look ma, the sql log
Failed asserting that Array (
''log'' => Array (
0 => Array (
''query'' => ''BEGIN''
''params'' => Array ()
''affected'' => null
''numRows'' => null
''took'' => null
)
1 => Array (
''query'' => ''INSERT INTO `test_database_name`.`owners` (`name`) VALUES (''Me'')''
''params'' => Array ()
''affected'' => 1
''numRows'' => 1
''took'' => 0.0
)
2 => Array (
''query'' => ''INSERT INTO `test_database_name`.`cars` (`color`, `owner_id`) VALUES (''red'', 1)''
''params'' => Array ()
''affected'' => 1
''numRows'' => 1
''took'' => 0.0
)
3 => Array (
''query'' => ''INSERT INTO `test_database_name`.`cars` (`color`, `owner_id`) VALUES (''blue'', 1)''
''params'' => Array ()
''affected'' => 1
''numRows'' => 1
''took'' => 0.0
)
4 => Array (
''query'' => ''COMMIT''
''params'' => Array ()
''affected'' => 1
''numRows'' => 1
''took'' => 0.0
)
)
''count'' => 9
''time'' => 0.0
) is identical to Array ().
FAILURES!
Tests: 1, Assertions: 2, Failures: 1.
$
Tenga en cuenta que correctamente se creó un propietario para "Yo" y dos automóviles, cada uno vinculado al registro del propietario para "Yo".