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的样子:
为什么CakePHP不能保存汽车?
解决方法:
由于以下问题无法给出直接解决的答案:问题中的代码没有任何问题.这可能意味着你根本没有运行自己的代码.
鉴于可以给出的唯一答案是建议,唯一对问题中的示例重要的类是所有者.
检查文件名
The Model class OptionValue would be found in a file named 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');
}
}
哪个应该输出:
-> 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.
$
请注意,正确的一个所有者是为“我”创建的,还有两个汽车 – 每个都链接到“我”的所有者记录.
标签:php,cakephp,cakephp-2-4 来源: https://codeday.me/bug/20190917/1808765.html