编程语言
首页 > 编程语言> > CakePHP不使用我的模型

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不能保存汽车?

解决方法:

由于以下问题无法给出直接解决的答案:问题中的代码没有任何问题.这可能意味着你根本没有运行自己的代码.

鉴于可以给出的唯一答案是建议,唯一对问题中的示例重要的类是所有者.

检查文件名

model conventions是:

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