1

我从 CakePHP 开始。我有非常简单的模型:

  • 用户
  • 公司
  • CompaniesUsers(用户和公司之间的 hasMany 关系)

我创建了一个用户,当我以此用户身份登录时,如果用户和公司之间没有任何关系,我将被重定向到公司控制器的添加操作。这一切都完成了,并且运行良好。

我的“大”问题是:当我保存公司时,我必须保存公司的数据以及当前用户与创建的公司之间的关系。这一切都必须在交易中完成,因为我不想要“孤儿”公司。但是我应该把这段代码放在哪里?在 Companies 模型中创建一个 save() 函数并在保存后创建关系?在 Companies 模型中创建 afterSave() 函数?将所有代码放在 CompaniesController 的添加操作中?我认为最后一个选项不是一个好主意,业务逻辑必须在模型中,不是吗?

我知道这一定是一个非常基本的问题,但我是 CakePHP 和 MVC 的新手。

4

2 回答 2

3

这一切都必须在交易中完成,因为我不想要“孤儿”公司

使用 saveAssociated

CakePHP 已经提供了一个完全符合您要求的函数:saveAssociated(也可以通过saveAll访问)

模型::saveAssociated(array $data = null, array $options = array())

options 数组有多个最相关的键:

atomic:如果为 true(默认),将尝试将所有记录保存在单个事务中。如果数据库/表不支持事务,则应设置为 false。

因此不需要任何额外的代码,只需调用saveAssociated现在save被调用的地方。

用法

确保保存的数据是hasMany through 关系的正确格式- 如果有疑问,它应该与包含相同数据的 find 格式相同:

class ExampleController extends AppController {

    function example() {
        $data = array(
            'Company' => array(
                'name' => 'My Company'
            ),
            'CompaniesUser' => array(
                'user_id' => 'My User Id'
            )
        );

        $this->Company->saveAssociated($data);
    }

}

这将保存新公司以及与给定用户的关系 - 或者无法修改数据库中的任何内容。

于 2013-10-27T17:21:33.887 回答
1

你的第一个问题的答案是你不需要在模型中插入额外的代码,这可以像这样在控制器中完成

公司控制器.php

$datasource = $this->Company->getDataSource();
try{
    $datasource->begin();
    if(!$this->Company->save($data)
        throw new Exception();

    if(!$this->User->save($data_one)
        throw new Exception();

    $datasource->commit();
} catch(Exception $e) {
    $datasource->rollback();
}

第二个问题的答案有点难。我个人觉得 Cakephp 充满了不好的做法。它应该遵循Fat Model 和 Skinny Controller的概念。如果您想编写 MVC 的最佳实践,那么模型层将包含与蛋糕基本功能不同的所有业务逻辑。

于 2013-10-27T10:33:39.160 回答