CakePHP не использует мои модели

У меня есть две модели CakePHP V 2.4.5:

class Owner extends AppModel { public $name = 'Owner'; public $hasMany = array('Car'); } 

а также

 class Car extends AppModel { public $name = 'Car'; public $belongsTo = array('Owner'); } 

в моем контроллере я написал:

 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)); } 

Но CakePHP создал владельца и забыл создать свои машины:

 1 BEGIN 2 INSERT INTO `test`.`owners` (`name`) VALUES ('Me') 3 COMMIT 

Вот как выглядит мой ERM:

ERM

Почему CakePHP не сохраняет автомобили?

    Невозможно дать прямой ответ, потому что: Нет ничего плохого в коде в вопросе. Это, вероятно, означает, что вы вообще не используете свой собственный код.

    Учитывая, что единственным ответом, который может быть дан, является совет, единственным классом, который имеет значение для примера в вопросе, является « Owner .

    Проверка имен файлов

    Типовые соглашения :

    Класс Model OptionValue будет найден в файле с именем OptionValue.php

    Ошибочные файлы моделей, безусловно, являются наиболее распространенной причиной «почему моя модельная логика не выполняется». Одна ошибка заключается в том, чтобы добавить суффикс Model.php в файлы модели, правильно ли указан файл модели?

    В этом случае проверьте, существует ли файл app/Model/Owner.php .

    Убедитесь, что модель является вашей моделью

    Если вы уверены, что файл модели указан правильно, проверьте, что использует приложение :

     debug(get_class($this->Owner)); ########## DEBUG ########## 'Owner' ########################### 

    Если выход «AppModel» – файл модели не загружен. Существует очень мало причин, почему CakePHP не будет использовать файл, который существует, и один из них будет применяться:

    • Файл не существует – в названии есть опечатка
    • Приложение не выглядит в том же каталоге, в котором вы находитесь
    • Приложение не имеет разрешения на открытие файла

    Убедитесь, что существует ассоциация

     debug($this->Owner->hasMany); ########## DEBUG ########## array( 'Car' => array( 'className' => 'Car', 'foreignKey' => 'owner_id', 'conditions' => '', 'fields' => '', 'order' => '', 'limit' => '', 'offset' => '', 'dependent' => '', 'exclusive' => '', 'finderQuery' => '', 'counterQuery' => '' ) ) ########################### 

    Если у Car нет выхода – ассоциация не сохраняется, потому что торт ее не существует – вам нужно будет определить, почему.

    Проверьте, какие файлы загружены

    Если есть сомнения, проверьте, какие файлы загружаются во время выполнения:

     debug(get_included_files()); ########## DEBUG ########## array( ... ...app/Model/Owner.php ... ) ########################### 

    Это может указывать на загрузку другого файла, что предотвращает загрузку app/Model/Owner.php .

    Используйте тест, чтобы проверить, что происходит

    Вы можете использовать тестовый пример для отладки помощников, например:

     <?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'); } } с <?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'); } } 

    Который должен выводить:

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

    Обратите внимание, что правильно создан один владелец для «Я» и два автомобиля – каждый связан с записью владельца «Я».

    Я проверил ваш код.
    Он работает отлично.
    Попробуйте удалить кэш моделей в папке / tmp / cache
    Мои результаты:

     (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 

    Не могли бы вы попробовать:

     $this->Owner->saveAll($data); 

    Вместо

     $this->Owner->saveAssociated($data, array('deep' => true)); 

    благодаря

    Не настоящий ответ, но я только что проверил ваш код, и он работает и для меня. (Торт 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 

    Если вы попробуете новый экземпляр CakePHP только с этими необходимыми моделями и контроллером, он все еще не работает?

    Примечание. Чтобы транзакции корректно работали в MySQL, ваши таблицы должны использовать движок InnoDB. Помните, что таблицы MyISAM не поддерживают транзакции.