initialize autorender php cakephp cakephp-2.4

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