标签: cakephp-model

使用单个事务提交和回滚的多个模型的事务管理

我是cakephp的新手.我想知道在cakephp中是否可以使用单个事务处理多个模型提交和回滚.我想做这样的事情

<?php
function add(){
    $transaction = begintransaction;
    if(model1->save()){
        if(model2->save()){
            if(model3->save(){
            }
            else{
                $errorFlag['model3'] = "Error in model 3"; 
            }
        }
        else{
            $errorFlag['model2'] = "Error in model 2";
        }
    }
    else{
        $errorFlag['model3'] = "Error in model 3";
    }
    if(empty($errorFlag)){ //no error in saving the model
        $transaction->commit();
        $this->Session->setFlash(__('The form data with multiple model is saved', true)); 
    }
    else{   //error in saving the model
        $transaction->rollback();
        $this->Session->setFlash(__('The form data with multiple model is saved', true));
    }
}
?>
Run Code Online (Sandbox Code Playgroud)

cakephp transactions cakephp-model

5
推荐指数
1
解决办法
4615
查看次数

定义模型中的全局条件

是否可以为模型定义全局条件?

我有2个型号:UserStudent.在数据库中,它们都使用表,users但每个学生已设置parent_id为其所有者(在同一个表中设置),而每个用户都parent_id设置为Null.

当我使用例如

$this->find('all'); 
Run Code Online (Sandbox Code Playgroud)

Student模型中我想强制Cake只返回数据库表users中的那些记录parent_id != Null.

所以问题是 - 我可以在模型中以某种方式定义全局条件吗?像这样的东西:

public $conditions = array('Student.parent_id !=' => Null);

cakephp cakephp-2.0 cakephp-2.1 cakephp-model

5
推荐指数
1
解决办法
560
查看次数

如何在CakePHP中使用beforeValidate()?

我有一个带有URL字段的表单.该字段的默认值为:http://.但该领域不是必需的.用户可以跳过它并提交表单.它不应该返回错误,因为它不是必需的,因为它们没有输入URL.但是现在它确实如此,因为http://.

我听说我可以使用beforeValidate()检查它是否为http://,然后清除URL字段,允许我跳过错误消息.

但我不知道如何使用beforeValidate().我搜索了谷歌,但我找不到任何有用的例子.我在哪里放置beforeValidate()的代码?这是一个功能吗?如何从那里访问提交的表单数据?

谢谢.

php cakephp cakephp-1.3 cakephp-model

4
推荐指数
1
解决办法
7484
查看次数

仅在CAKEPHP中的find上获取一些字段

我的问题是当我从用户表中获取用户数据时,用户表的所有字段都从用户表中获取..但我不想包含密码和电子邮件地址,所以有没有办法只获取除密码和电子邮件地址?

问候.

cakephp cakephp-model

4
推荐指数
1
解决办法
2万
查看次数

创建一个与cakePHP中的模型无关的表单

我有一个用户选择文档的表单.然后,控制器将该文档保存到webroot文件夹中.

但是,在它显示表单之前,它给了我一个错误:

Missing Database Table
Error: Table office_layouts for model OfficeLayout was not found in datasource default.
Run Code Online (Sandbox Code Playgroud)

哪个是正确的,office_layouts没有数据库表.但它不是必需的.这就是没有桌子的原因.表单刚刚上传到服务器.

我已阅读创建表单,并尝试了以下内容:

// file: View/OfficeLayout/upload.ctp
echo $this->Form->create( null ,array('type' => 'file')); ?>
<fieldset>
    <legend><?php echo __('&emsp;Add Layout for ' . $branch); ?></legend>
    <?php
        echo $this->Form->input('layout',array('type'=>'file'));
    ?>
</fieldset>
<?php echo $this->Form->end(__('Submit')); ?>
Run Code Online (Sandbox Code Playgroud)

以及null转换到控制器名称(在这种情况下OfficeLayout).我也删除了所有参数(thus creating it like so: $this->Form->create())

在我的控制器中,我有以下内容:

public function upload($branch = null) {
    $this->set('branch',$branch);
    if(isset($this->request->data['OfficeLayout'])) {
        $file = $this->request->data['OfficeLayout']['layout'];
        if($file['error'] === UPLOAD_ERR_OK && move_uploaded_file($file['tmp_name'],APP . 'docs' …
Run Code Online (Sandbox Code Playgroud)

php cakephp-2.0 cakephp-model

4
推荐指数
1
解决办法
4586
查看次数

如何通过非常规命名的字段将CakePHP中的模型关联起来?

我有两个表都有字段username.我如何为本地和外国表指定字段名称?

我想CakePHP会做类似的事情

ON (`T1`.`username` = `T2`.`username`)`
Run Code Online (Sandbox Code Playgroud)

结果.如果没有任何更改,表将加入以下条件:

ON (`T1`.`id` = `T2`.`t1_id`)`
Run Code Online (Sandbox Code Playgroud)

设置'foreign_key' = 'username'属性是不够的,因为它会产生这样的查询:

ON (`t1`.`id` = `t2`.`username`)`
Run Code Online (Sandbox Code Playgroud)

我有两个解决方案.第一个是使用'join'属性并动态连接表.在这种情况下,我可以设置本地和外地字段.但是,如果我需要将更多表连接到那个表,手动加入,我不能再使用包含我需要手动编写以下连接,即使这些关联设置正确.所以我需要每次编写长连接定义而不是使用'contain' => array('T1', 'T2', 'T3')

其次是将表的'primary_key'设置为相应的字段.它可以在模型文件中或在运行时中完成.在我的情况下,它不能在模型中完成,因为该表也通过其'id'字段具有"正确"关联.设置运行时是这样的,但我不喜欢它,因为它不明显,看起来像一个黑客.

当我问这个问题时,我以为我错过了一些明显的东西,但现在我明白CakePHP就是不能这样做.所以我开始了一个赏金,希望有人分享解决方案.如果不是,我将尝试读取蛋糕源并重新定义模型的一些方法,以添加'foreign_key'在关联定义附近定义本地字段的能力.

php cakephp cakephp-model cakephp-2.3

4
推荐指数
2
解决办法
6524
查看次数

CakePHP - 递归模型中的特定字段?

我是CakePHP的新手,但我想我已经开始了解它.我试图递归地提取相关的表信息,但我想指定要递归的相关模型.让我举个例子来证明我的目标:

我有一个模型"客户",其中包含公司名称,网站等信息."客户"有许多"地址",其中包含联系人姓名,街道,城市,州,国家等个人联系人的信息."客户"也属于"CustomerType",它只是具有描述性类别信息 - 名称和描述,如"分销商"或"制造商".

当我对"客户"进行查找时,我希望将"CustomerType"和"Address"信息关联为子数组,只需正确设置hasMany和belongsTo关联即可.但现在,这是我的问题:我希望得到相关的州/国家信息.所以,不是每个"地址"数组行只有"state_id",我希望它有"state"=> array("id"= 20,"name"="纽约",......)等.

如果我在合作伙伴模型中将$ recursive设置为更高的值(例如,2),我会得到我想要的每个"地址"中的州/国家/地区信息.但它也会对"CustomerType"进行递归,这导致我的"Partner"对象的"CustomerType"字段具有与该类型匹配的所有Customer对象的大量数组,这可能是数千条长.

所以关键是,我不想在"CustomerType"上递归,只在"地址"上.有没有办法可以设置它?

抱歉这个冗长的问题,并提前感谢!

php cakephp cakephp-model

3
推荐指数
1
解决办法
4871
查看次数

加载模型或$ uses需要使用的数组?而我们访问其他模型

我有一个用户控制器,我需要在那些users_controllers上使用照片模型,我可以使用它从以下访问该模型,哪些是标准使用?

$this->loadModel('Photo');
Run Code Online (Sandbox Code Playgroud)

要么

var $uses =array('User','Photo');
Run Code Online (Sandbox Code Playgroud)

加载模型或$ uses需要使用的数组?

cakephp cakephp-1.3 cakephp-model

3
推荐指数
1
解决办法
3143
查看次数

cakephp - 获取表名及其列详细信息

有谁知道如何从型号名称获取表名?此外,我想获取该模型/表名称的所有列名称及其类型.是否有可能获得给定型号名称的详细信息?

谢谢.

cakephp cakephp-1.3 cakephp-model

3
推荐指数
1
解决办法
1万
查看次数

如何在CakePHP 2.0.2中指定数据库配置?

我刚安装了CakePHP 2.0.2用于新项目.我正在尝试使用被调用的数据库配置,development但我的模型似乎没有提起它.

基于CakePHP 2的新目录和文件名约定,我在以下位置创建了以下内容/app/Model/AppModel.php:

<?php
class AppModel extends Model {

    public $useDbConfig = 'development';
}
Run Code Online (Sandbox Code Playgroud)

但是,默认主页告诉我:

Cake无法连接到数据库.

然而,如果我在更改配置的名称/app/Config/database.php,以default将信息变为一个成功的消息,就好像它不拿起我的自定义AppModel类.

我该如何解决这个问题?正如新的CakePHP 2.0文档所说的$useDbConfig那样,如上所述使用该属性?

编辑:内容/app/Config/database.php:

class DATABASE_CONFIG {

    public $development = array(
        'datasource' => 'Database/Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'login' => 'root',
        'password' => '',
        'database' => 'cakephp_db',
        'prefix' => '',
        'encoding' => 'utf8',
    );
}
Run Code Online (Sandbox Code Playgroud)

php cakephp cakephp-2.0 cakephp-model

3
推荐指数
1
解决办法
1万
查看次数