ホームページ >バックエンド開発 >PHPチュートリアル >CakePHP 2.x CookBook 中国語版 第 7 章 モデル - データの保存_PHP チュートリアル

CakePHP 2.x CookBook 中国語版 第 7 章 モデル - データの保存_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-14 10:08:40964ブラウズ

セーブデータ

CakePHP は、保存されたモデル データのスナップショットを取得します。保存するデータは、次の基本形式を使用してモデルの save() メソッドに渡されます:
1 配列
2 (
3 [モデル名] => 配列
4 (
5 [フィールド名1] => '値'
6 [フィールド名2] => '値'
7)
8)
ほとんどの場合、この形式について心配する必要はありません。CakePHP の FormHelper とモデルの find メソッドは、すべてのデータをこの形式でパッケージ化します。他のヘルパーを使用する場合、データは $this->request->data の形式でも便利に利用できます。
以下は、CakePHP モデルを使用してデータをデータベース テーブルに保存するコントローラー アクションの例です。
1 パブリック関数 edit($id) {
2 // POST中のフォームデータはありますか?
3 if ($this->request->is('post')) {
4 // フォームデータが検証に合格して保存できれば...
5 if ($this->Recipe->save($this->request->data)) {
6 // セッションジャンプ情報を設定してジャンプします
7 $this->Session->setFlash('レシピを保存しました!');
8 $this->redirect('/recipes');
9 }
10 }
11
12 // フォームデータがない場合は、編集したレシピを見つけてビューに割り当てます。
13 $this->set('レシピ', $this->レシピ->findById($id));
14 }
save メソッドが呼び出されると、最初のパラメーターで渡されたデータが CakePHP 検証メカニズムによって検証されます (詳細については、「データ検証」セクションを参照してください)。 何らかの理由でデータが保存されない場合は、データが特定の検証ルールに準拠していないかどうかを確認してください。 Model::$validationErrors を出力することで、この状況をデバッグできます。
1 if ($this->レシピ->保存($this->リクエスト->データ)) {
2 // 「保存」成功後の処理ロジック
3}
4 デバッグ($this->レシピ->validationErrors);
保存に関連するその他の便利なモデルメソッド:
Model::set($one, $two = null)
Model::set() を使用して、1 つ以上のデータ列をモデルのデータ配列に入れることができます。 Model によって提供される ActiveRecord 属性を持つモデルを使用する場合に便利です:
1 $this->Post->read(null, 1);
2 $this->Post->set('title', '記事の新しいタイトル');
3 $this->Post->save();
この例は、ActiveRecord の set() メソッドを使用して単一の列を更新および保存する方法を示しています。 set() を使用して、複数の列に新しい値を割り当てることもできます:
1 $this->Post->read(null, 1);
2 $this->Post->set(array(
)
3 'タイトル' => '新しいタイトル',
4 '公開済み' => false
5 ));
6 $this->Post->save();
上記の例では、タイトルと公開された列を更新し、データベースに保存します。
Model::save(配列 $data = null、ブール値 $validate = true、配列 $fieldList = array())
このメソッドはデータを配列形式で保存します。 2 番目のパラメータでは検証をスキップでき、3 番目のパラメータでは保存するモデルの列のリストを指定できます。セキュリティを強化するために、$fieldList を使用して保存する列を制限できます。
メモ
$fieldList が提供されていない場合、悪意のあるユーザーがフォーム データに追加の列を追加し (SecurityComponent を使用していない場合)、この方法で変更できない列を変更する可能性があります。
save メソッドには代替構文もあります:
1 save(配列 $data = null, 配列 $params = array())
$params 配列にはキーとして次のオプションを含めることができます:
validate は true/false に設定され、検証を許可または無効にします。
fieldList を使用すると、列の配列を保存できます。
callbacks コールバックを無効にするには false に設定します。 「before」または「after」を使用すると、指定されたコールバックのみが許可されます。
モデルコールバックの詳細については、こちらをご覧ください
ヒント
データを保存するときに更新列を更新したくない場合は、$data 配列に 'updated' => false を追加します。
保存すると、モデル オブジェクトの $id プロパティを使用してオブジェクトの ID を取得できます。これは、新しいオブジェクトを作成するときに役立ちます。
1 $this->材料->保存($newData);
2 $newIngredientId = $this->Ingredient->id;
作成または更新は、モデルの ID 列を通じて制御されます。 $Model->id が設定されている場合、この主キーを持つレコードが更新されます。 それ以外の場合は、新しいレコードが作成されます:
1 // 新しいレコードを作成します: ID が設定されていないか、null に設定されています
2 $this->レシピ->create();
3 $this->レシピ->保存($this->リクエスト->データ);
4
5 //レコードを更新: ID には数値が設定されます
6 $this->レシピ->id = 2;
7 $this->レシピ->保存($this->リクエスト->データ);
ヒント
ループ内で save を呼び出すときは、create() を忘れずに呼び出してください。
新しいレコードを作成するのではなく値を更新したい場合は、主キー列がデータ配列に渡されていることを確認する必要があります。
1 $data = array('id' => 10, 'title' => '新しいタイトル');
2 // ID 10 のレシピレコードが更新されます
3 $this->レシピ->save($data);
Model::create(array $data = array())
このメソッドは、モデルの状態をリセットして新しい情報を保存します。 実際にはデータベースに新しいレコードは作成されませんが、プリセットされた Model::$id がクリアされ、データベース列のデフォルトに基づいて Model::$data にデフォルト値が設定されます。
$data パラメーターが (上記の配列形式を使用して) 渡された場合、モデル インスタンスはこのデータを保存する準備が整います ($this->data を使用して)。
配列の代わりに false がこのメソッドに渡された場合、モデルは、以前に設定されていないモデル構造に従って実際には列を初期化せず、設定された列のみをリセットし、未設定の列はそのまま残します。 これは、データベースにすでに設定されている列の値が更新されるのを避けるために行われます。
ヒント
既存の行を更新する代わりに新しい行を挿入したい場合は、最初に create() を呼び出す必要があります。これにより、コールバックまたは他の場所で呼び出された保存との競合が回避されます。
Model::saveField(string $fieldName, string$fieldValue, $validate = false)
単一列の値を保存するために使用されます。 saveField() を使用する前に、モデル ID ($this->ModelName->id = $id) を設定します。このメソッドを使用する場合、$fieldName にはモデル名や列ではなく、列名のみを含める必要があります。
たとえば、ブログのタイトルを更新するには、次のようにコントローラーで saveField を呼び出すことができます:
1 $this->Post->saveField('title', '新しい日の新しいタイトル');
警告
このメソッドを使用して更新するときに列の更新を停止することはできません。save() メソッドを使用する必要があります。
saveField メソッドには代替構文もあります:
1 saveField(string $fieldName, string $fieldValue, array $params = array())
$params 配列にはキーとして次のオプションを含めることができます:
validate は true/false に設定され、検証を許可または無効にします。
callbacks コールバックを無効にするには false に設定します。 「before」または「after」を使用すると、指定されたコールバックのみが許可されます。
Model::updateAll(array $fields, array $conditions)
1 回の呼び出しで 1 つ以上のレコードを更新します。更新されるレコードは $conditions 配列によって識別され、$fields パラメーターで指定された列と値が更新されます。
たとえば、1 年以上メンバーであるすべてのパン屋を承認するには、次の更新ステートメントを呼び出します:
1 $this_year = date('Y-m-d h:i:s', strtotime('-1 year'));
2
3 $this->Baker->updateAll(
4 配列('Baker.approved' => true),
5 配列('Baker.created <=' => $this_year)
6);
ヒント
$fields 配列は SQL 式を受け入れます。リテラルは Sanitize::escape() を使用して手動で引用されます。
メモ
カラム内に存在する編集カラムが更新されても、ORM経由で自動更新されません。更新するアレイに手動で追加する必要があります。
たとえば、指定した顧客に属するすべてのチケットを閉じるには:
1 $this->チケット->updateAll(
2 array('Ticket.status' => "'closed'"),
3 配列('Ticket.customer_id' => 453)
4);
デフォルトでは、updateAll() は結合をサポートするデータベースのbelongsTo 関連付けに自動的に接続します。この接続は、関連付けを一時的にバインドすることで防止できます。
Model::saveMany(array $data = null, array $options= array())
このメソッドは、同じモデルの複数の行を同時に保存するために使用されます。次のオプションを指定できます:
validate: 検証を無効にするには false に設定し、保存する前に各レコードを検証するには true に設定し、保存する前にすべてのレコードをチェックするには 'first' (これがデフォルト) に設定します。
アトミック: true (デフォルト) の場合、すべてのレコードが単一の命令で保存されます。データベース/テーブルが単一の命令をサポートしていない場合は、false に設定する必要があります。
fieldList: Model::save() メソッドの $fieldList パラメーターと同じです。
deep: (バージョン 2.1 以降) true に設定すると、関連データも保存されます。saveAssociated を参照してください。
単一モデルの複数のレコードを保存するには、$data は数値インデックス付きのレコード配列である必要があります。
1 $data = 配列(
2 配列('タイトル' => 'タイトル 1'),
3 配列('タイトル' => 'タイトル 2'),
4);
メモ
$data に通常含まれる Article キーの代わりに数値インデックスを渡します。同じモデルの複数のレコードを保存する場合、モデルのキーではなく数値を使用してレコード配列にインデックスを付ける必要があります。
次の形式のデータも受け入れることができます:
1 $data = 配列(
2 array('記事' => 配列('タイトル' => 'タイトル 1')),
3 array('記事' => 配列('タイトル' => 'タイトル 2')),
4);
$options['deep'] = true で関連データも保存したい場合、上記の 2 つの例は次のコードのようになります:
1 $data = 配列(
2 array('title' => 'title 1', 'Assoc' => array('field' => 'value')),
3 配列('タイトル' => 'タイトル 2'),
4);
5 $data = 配列(
6 array('Article' => array('title' => 'title 1'), 'Assoc' => array('field' => 'value')),
7 array('記事' => 配列('タイトル' => 'タイトル 2')),
8);
9 $Model->saveMany($data, array('deep' => true));
新しいレコードを作成する代わりにレコードを更新したい場合は、データ行に主キー インデックスを追加する必要があることに注意してください。
1 $data = 配列(
2 array('Article' => array('title' => '新しい記事')), // 新しいレコードを作成します
3 array('Article' => array('id' => 2, 'title' => 'title 2')), // 既存のレコードを更新します
4);
Model::saveAssociated(array $data = null, array$options = array())
このメソッドは、複数のモデルの関連付けを一度に保存するために使用されます。次のオプションを指定できます:
validate: 検証を無効にするには false に設定し、保存する前に各レコードを検証するには true に設定し、保存する前にすべてのレコードをチェックするには 'first' (これがデフォルト) に設定します。
atomic: true (デフォルト) の場合、すべてのレコードが 1 つの命令で保存されます。データベース/テーブルが 1 つの命令をサポートしていない場合は、false に設定する必要があります。
fieldList: Model::save() メソッドの $fieldList パラメーターと同じです。
deep: (バージョン 2.1 以降) true に設定すると、関連データも保存されます。saveAssociated を参照してください。
レコードを保存すると同時に hasOne またはbelongsTo が関連付けられているレコードも保存するには、データ配列は次のようになります:
1 $data = 配列(
2 'ユーザー' => array('ユーザー名' => 'ビリー'),
3 'プロフィール' => array('性別' => '男性', '職業' => 'プログラマー'),
4);
レコードを保存すると同時に hasMany が関連付けられているレコードも保存するには、データ配列は次のようになります:
1 $data = 配列(
2 '記事' => array('タイトル' => '最初の記事'),
3 'コメント' => array(
4 array('body' => 'コメント 1', 'user_id' => 1),
5 array('body' => 'コメント 2', 'user_id' => 12),
6 array('body' => 'コメント 3', 'user_id' => 40),
7)、
8);
レコードを保存しながら、2 レベル以上の深さの hasMany に関連付けられたレコードも保存するには、データ配列は次のようになります:
1 $data = 配列(
2 'ユーザー' => array('email' => 'john-doe@cakephp.org'),
3 'カート' => array(
4 配列(
5 'payment_status_id' =>
6 'total_cost' => 250,
7 'CartItem' => array(
8 array(
9 'cart_product_id' =>
10 '数量' => 1,
11 'コスト' => 100,
12 )、
13 array(
14 'cart_product_id' =>
15 '数量' => 1,
16 'コスト' => 150,
17 )
18)
19)
20)
21);
メモ
保存が成功すると、メイン モデルの外部キーが関連モデルの id 列に保存されます (例: $this->LargeModel->id)。
警告
アトミック オプションを false に設定して saveAssociated メソッドを呼び出す場合は、論理値ではなく配列が返されるので注意してください。
バージョン 2.1 で変更: 深い関連付けからデータを保存できるようになりました ($options['deep'] = true で設定)。
hasMany の関連付けと深く関連付けられたコメントの所属データを持つ関連レコードも保存しながら、レコードを保存するには、データ配列は次のようになります::
1 $data = 配列(
2 '記事' => array('タイトル' => '私の最初の記事'),
3 'コメント' => array(
4 array('body' => 'コメント 1', 'user_id' => 1),
5 array('body' => '新しいユーザーも保存', 'User' => array('first' => 'mad', 'last' => 'coder')),
6)、
7);
そして次のステートメントを使用して保存します:
1 $Article->saveAssociated($data, array('deep' => true));
バージョン 2.1 で変更: Model::saveAll() およびファミリー メソッドは、複数のモデルの fieldList の受け渡しをサポートするようになりました。
複数のモデルに fieldList を渡す例:
1 $this->SomeModel->saveAll($data, array(
)
2 'fieldList' => array(
3 'SomeModel' => array('field_1'),
4 'AssociatedModel' => array('field_2', 'field_3')
5)
6 ));
fieldList は、モデルのエイリアスをキーとして、列の配列を値として持つ配列です。 モデル名は保存データと同じものが使用され、ネストすることはできません。
Model::saveAll(array $data = null, array $options =array())
saveAll 関数は、savaMany メソッドと saveAssociated メソッドの単なるラッパーです。データを検査し、どのタイプのデータ保存を実行するかを決定します。データを見て、実行する保存の種類を決定します。データが数値インデックス付き配列の場合は saveMany が呼び出され、それ以外の場合は saveAssociated が呼び出されます。
この関数のオプションは前の 2 つの関数と同じであり、下位互換性があります。実際の状況に応じて、saveMany または saveAssociated を使用することをお勧めします。
関連するモデルデータを保存する(hasOne、hasMany、belongsTo)
関連するモデルを操作する場合、モデルデータの保存は常に対応する CakePHP モデルによって行われることに注意してください。新しい投稿とそれに関連付けられたコメントを保存する場合は、保存操作中に投稿モデルとコメント モデルの両方を使用する必要があります。
システムに関連付けられたモデル レコードがない場合 (たとえば、新しいユーザーを保存し、関連するプロファイル レコードを同時に保存する場合)、最初にメイン モデルまたは親モデルを保存する必要があります。
これがどのように機能するかを理解するために、新しいユーザーと関連するプロファイルの保存を処理するコントローラー内のアクションがあると想像してください。次のアクション例では、単一のユーザーと単一のプロファイルを作成するのに十分なデータが (FormHelper を使用して) POST されたことを前提としています。
1 パブリック関数 add() {
2 if (!empty($this->request->data)) {
3 // ユーザーデータを保存できます:
4 // $this->request->data['User'] に配置されます
5
6 $user = $this->User->save($this->request->data);
7
8 // ユーザーが保存されている場合は、この情報をデータに追加してプロファイルを保存します。
9
10 if (!empty($user)) {
11 // 新しく作成されたユーザー ID が $this->User->id に割り当てられました。
12 $this->request->data['Profile']['user_id'] = $this->User->id;
13
14 // ユーザーには 1 つのプロファイルがあるため、プロファイル モデルにはユーザー モデルを通じてアクセスできます。
15 $this->ユーザー->プロフィール->保存($this->リクエスト->データ);
16 }
17 }
18 }
原則として、hasOne、hasMany、belongsTo との関連付けに関しては、すべてキーが問題になります。基本的な考え方は、あるモデルからキーを取得し、それを別のモデルの外部キー列に入れることです。これには、保存されたモデル クラスの $id 属性の使用が必要な場合もありますが、コントローラー アクションに POST するフォームの非表示の入力から取得した ID のみが必要な場合もあります。
上記の基本メソッドの補足として、CakePHP は非常に便利なメソッド saveAssociated() も提供します。これを使用すると、複数のモデルを短時間で確認して保存できます。さらに、saveAssociated() は、データベース内のデータの整合性を確保するためのトランザクション サポートも提供します (たとえば、1 つのモデルが保存に失敗した場合、もう 1 つのモデルは保存されません)。
メモ
MySQL でトランザクションが適切に動作するには、テーブルで InnoDB エンジンを使用する必要があります。 MyISAM テーブルはトランザクションをサポートしていないことに注意してください。
saveAssociated() を使用して Company モデルと Account モデルを同時に保存する方法を見てみましょう。
まず、会社とアカウントの両方のフォームを作成する必要があります (会社には多くのアカウントがあると仮定します):
1 echo $this->Form->create('Company', array('action' => 'add'));
2 echo $this->Form->input('会社名', array('ラベル' => '会社名'));
3 echo $this->Form->input('Company.description');
4 echo $this->Form->input('Company.location');
5
6 echo $this->Form->input('Account.0.name', array('label' => 'アカウント名'));
7 echo $this->Form->input('Account.0.username');
8 echo $this->Form->input('Account.0.email');
9
10 echo $this->Form->end('Add');
アカウントモデルのフォーム列に名前を付ける方法を見てください。 Company がメイン モデルの場合、saveAssociated() は、関連付けられたモデル (Account) データが指定された形式で配列に入れられることを期待します。必要な Account.0.fieldName があります。
メモ
上記の列の名前付けは、hasMany 関連付けに必要です。関連付けが hasOne の場合、関連付けられたモデルには ModelName.fieldName を使用する必要があります。
これで、 CompaniesController で add() アクションを作成できます。
1 パブリック関数 add() {
2 if (!empty($this->request->data)) {
3 // 検証エラーを回避するには、次のメソッドを使用します:
4 unset($this->Company->Account->validate['company_id']);
5 $this->Company->saveAssociated($this->request->data);
6 }
7 }
これですべての手順です。これで、会社モデルとアカウントモデルが同時に検証され、保存されます。デフォルトでは、saveAssociated は渡されたすべての値をチェックし、各保存を実行しようとします。
データ経由で保存できるものがたくさんあります
結合テーブルに存在する2つのモデルのデータがどのように保存されるかを見てみましょう。 「hasMany Through (モデルの結合)」セクションに示すように、結合テーブルは hasMany タイプの関係を使用して各モデルに関連付けられます。 私たちの例には、ケーキ スクールのディレクターから、生徒が特定のクラスに出席した日数と成績を記録できるプログラムを書いてほしいという依頼が含まれていました。サンプルコードは次のとおりです:
1 // コントローラー/CourseMembershipController.php
2 クラス CourseMembershipsController は AppController を拡張します {
3 public $uses = array('CourseMembership');
4
5 パブリック関数 Index() {
6 $this->set('courseMembershipsList', $this->CourseMembership->find('all'));
7 }
8
9 パブリック関数 add() {
10 if ($this->request->is('post')) {
11 if ($this->CourseMembership->saveAssociated($this->request->data)) {
12 $this->redirect(array('action' => 'index'));
13 }
14 }
15 }
16 }
17
18 // 表示/コースメンバーシップ/add.ctp
19
20 Form->create('CourseMembership');
21 Form->input('Student.first_name') ?>
22 Form->input('Student.last_name') ?>
23 Form->input('Course.name') ?>
24 Form->input('CourseMembership.days_attended') ?>
25 Form->input('CourseMembership.grade') ?>
26
27 Form->end() ?>
送信されたデータ配列は次のとおりです:
1 配列
2 (
3 [生徒] => 配列
4 (
5 [名前] => ジョー
6 [姓] =>
7)
8
9 [コース] => 配列
10 (
)
11 [名前] => ケーキ
12)
13
14 [コースメンバーシップ] => 配列
15 (
)
16 [出席日数] => 5
17 [グレード] => A
18)
19
20)
Cake は、このデータ構造で 1 回の saveAssociated 呼び出しを使用して、一度に多数を保存し、Student と Course の外部キーを CouseMembership に割り当てます。CourseMembershipsController でインデックス アクションを実行すると、find('all') から取得されたデータ構造になります。は次のとおりです:
1 配列
2 (
3 [0] => 配列
4 (
5 [コースメンバーシップ] => 配列
6 (
7 [id] => 1
8 [学生ID] => 1
9 [コースID] => 1
10 [出席日数] => 5
11 [成績] =>
12)
13
14 [学生] => 配列
15 (
)
16
17 [名前] => ジョー
18 [姓] =>
19)
20
21 [コース] => 配列
22(
)
23 E24 [名前] = & gt;
25)
26)
27)
もちろん、接続されたモデルを操作する方法はたくさんあります。上記のバージョンでは、すべてをすぐに保存することを前提としています。 Student と Course を個別に作成し、後で CourseMembership との関連付けを指定したい場合もあります。 したがって、リストまたは ID と 2 つの CourseMembership メタ列によって既存の学生とコースを選択できるフォームが考えられます。例:
1 // 表示/CourseMemberships/add.ctp
2
3 Form->create('CourseMembership');
4 Form->input('Student.id', array('type' => 'text', 'label' => '学生 ID', 'default' =>1));
5 Form->input('Course.id', array('type' => 'text', 'label' => 'コース ID', 'default' =>1));
6 Form->input('CourseMembership.days_attended') ?>
7 Form->input('CourseMembership.grade') ?>
8
9 Form->end() ?>
結果の POST データ:
1 配列
2 (
3 [生徒] => 配列
4 (
5 [id] => 1
6)
7
8 [コース] => 配列
9 (
10 [id] => 1
11)
12
13 [コースメンバーシップ] => 配列
14 (
)
15 [出席日数] => 10
16 [グレード] => 5
17)
18)
Cake は saveAssociated を使用して学生 ID とコース ID を CourseMembership にプッシュします。
関連モデルデータの保存(HABTM)
hasOne、belongsTo、および hasMany を使用して関連モデルを保存するのは非常に簡単です。関連モデルの ID を外部キー列に入力するだけです。 入力した後、モデル上で save() メソッドを呼び出すだけで、すべてが正しく接続されます。 以下は、タグ モデルの save() メソッドに渡されるデータ配列の形式の例です:
1 配列
2 (
3 [レシピ] => 配列
4 (
5 [id] => 42
6)
7 [タグ] => 配列
8 (
] 9 [名前] = & gt;
10)
11)
saveAll() でこの形式を使用して、HABTM に関連付けられた複数のレコードとモデルを保存することもできます。形式は次のとおりです。
1 配列
2 (
3 [0] => 配列
4 (
5 [レシピ] => 配列
6 (
7 [id] => 42
8 )
9 [タグ] =>配列
10 (
11 [名前] =>イタリア語
12 )
13 )
14 [1] =>配列
15 (
16 [レシピ] =>配列
17 (
18 [id] => 42
19 )
20 [タグ] =>配列
21 (
22 [名前] =>パスタ
23 )
24 )
25 [2] =>配列
26 (
27 [レシピ] =>配列
28 (
29 [id] => 51
30 )
31 [タグ] =>配列
32 (
33 [名前] =>メキシコ人
34 )
35 )
36 [3] =>配列
37 (
38 [レシピ] =>配列
39 (
40 [id] => 17
41 )
42 [タグ] =>配列
43 (
44 [名前] =>アメリカ人(新規)
45 )
46 )
47)
上の数値グループが saveAll() に渡され、含まれるタグが作成され、それぞれがそれぞれのレシピに関連付けられます。
例として、レシピに関連する新しいタグと実行期間の生成の表を作成しました。
この完璧な表单の如く:(我们假定 $recipe_id 已经設定了):
1 Form->create('Tag'); ?>
2 Form->input(
3 'レシピ.id'、
4 array('type' => 'hidden', 'value' => $recipe_id)
5 ); ?>
6 Form->input('Tag.name'); ?>
7 Form->end('タグの追加'); ?>
この例では、レシピの ID として設定されている、Recipe.id 隠しドメインが表示されます。
コントロール内で save() メソッドを使用して、HABTM データをデータ库に自動的に保存します:
1 パブリック関数 add() {
2 // 保存关联
3 if ($this->タグ->save($this->request->data)) {
4 // 保存成功後の要旨
5 }
6 }
このセグメント コードは新しいタグを作成し、レシピに関連付けます。その ID は $this->request->data['Recipe']['id'] で設定されます。
特定の状況では、提示された関連データにダウンローディング選択リストを含めることができると考えられます。放进 :
1 // 制御器中の代コード:
2 $this->set('tags', $this->レシピ->タグ->find('list'));
1 // 動画中の代コード:
2 $this->Form->input('tags');
より可能性の高いシナリオは、HABTM 関係に複数の選択を許可する