1

私はCakePHPから始めています。私は非常に単純なモデルを持っています:

  • ユーザー
  • 企業
  • CompaniesUsers (ユーザーと会社の間の hasMany スルー リレーション)

ユーザーを作成し、このユーザーとしてログインすると、ユーザーと会社の間に関係がない場合、会社コントローラーの追加アクションにリダイレクトされます。これですべて完了し、うまく機能しています。

私の「大きな」問題は、会社を保存するときに、会社のデータと、現在のユーザーと作成された会社との関係を保存する必要があることです。私は「孤立した」企業を望んでいないので、これはすべてトランザクション内で行う必要があります。しかし、このコードはどこに配置すればよいでしょうか? Companies モデルで save() 関数を作成し、保存後に関係を作成しますか? Companies モデルで afterSave() 関数を作成しますか? すべてのコードを CompaniesController の add アクションに入れますか? この最後のオプションは良い考えではないと思います。ビジネス ロジックがモデルに含まれている必要がありますね。

これは非常に基本的な質問に違いないことはわかっていますが、CakePHP と MVC は初めてです。

4

2 に答える 2

3

「孤児」の会社を望んでいないので、これはすべてトランザクション内で行う必要があります

saveAssociated を使用する

CakePHP は、まさにあなたが求めていることを正確に実行する関数をすでに提供しています: saveAssociated ( saveAllからもアクセス可能)

Model::saveAssociated(array $data = null, array $options = array())

options 配列には、最も関連性の高い複数のキーがあります。

atomic: true (デフォルト) の場合、単一のトランザクションですべてのレコードを保存しようとします。データベース/テーブルがトランザクションをサポートしていない場合は、false に設定する必要があります。

そのため、追加のコードは必要ありません。saveAssociated現在呼び出さsaveれている場所を呼び出すだけです。

使用法

保存されたデータがhasMany スルー リレーションシップの正しい形式であることを確認します。疑わしい場合は、同じデータを含む検索と同じ形式にする必要があります。

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

最初の質問の答えは、モデルに追加のコードを挿入する必要がないということです。これは、このようなコントローラーで行うことができます

CompanyController.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();
}

2 番目の質問の答えは少し難しいです。個人的には、Cakephp には悪い慣行がたくさんあると感じています。Fat Model と Skinny Controller Conceptに従う必要があります。MVC のベスト プラクティスをコーディングする場合、モデル レイヤーにはケーキの基本機能とは異なり、すべてのビジネス ロジックが含まれます。

于 2013-10-27T10:33:39.160 に答える