diff --git a/ja/orm/entities.rst b/ja/orm/entities.rst index f779589bca..5cce00e311 100644 --- a/ja/orm/entities.rst +++ b/ja/orm/entities.rst @@ -1,5 +1,5 @@ エンティティー -######## +############## .. php:namespace:: Cake\ORM @@ -9,15 +9,15 @@ エンティティーがアプリの各行やドメインオブジェクトを表します。 エンティティーはそれらのデータにアクセスして操作するための継続的なプロパティーとメソッドを含みます。 -エンティティーはCakePHPによって ``find()`` を使った時に毎回テーブルオブジェクトに作られます。 +エンティティーは CakePHP によって ``find()`` を使った時に毎回テーブルオブジェクトに作られます。 エンティティークラスの生成 -======================= +========================== -CakeのORMを使うためにエンティティークラスを生成する必要はありません。 +CakePHP の ORM を使うためにエンティティークラスを生成する必要はありません。 でも、使用するエンティティでロジックをカスタマイズしたいなら、クラスを作る必要があります。 規約に従うと **src/Model/Entity/** にクラスが存在するはずです。 -もし、 ``articles`` テーブルが存在するなら、以下のエンティティーが作れます。:: +もし、 ``articles`` テーブルが存在するなら、以下のエンティティーが作れます。 :: // src/Model/Entity/Article.php namespace App\Model\Entity; @@ -28,23 +28,23 @@ CakeのORMを使うためにエンティティークラスを生成する必要 { } -いま、このエンティティーは何も出来ません。でも、データをarticleテーブルからロードして、 +いま、このエンティティーは何も出来ません。でも、データを article テーブルからロードして、 このクラスのインスタンスを作れます。 .. note:: - もし、エンティティクラスを定義したくないなら、Cakeはデフォルトのエンティティークラスを使います。 + もし、エンティティクラスを定義したくないなら、CakePHP はデフォルトのエンティティークラスを使います。 エンティティー生成 -================= +================== -エンティティーは直接インスタンスを生成できる:: +エンティティーは直接インスタンスを生成できます。 :: use App\Model\Entity\Article; $article = new Article(); -エンティティーからインスタンスを生成する時、インスタンスに必要なプロパティーを渡すことができる。:: +エンティティーからインスタンスを生成する時、インスタンスに必要なプロパティーを渡すことができます。 :: use App\Model\Entity\Article; @@ -67,10 +67,10 @@ CakeのORMを使うためにエンティティークラスを生成する必要 ]); エンティティーのデータへのアクセス -===================== +================================== エンティティーはいくつかのそれらに含まれるデータに接続するための提供します。 -最も一般的なのは、オブジェクトの表記法を使ってエンティティー内のデータにアクセスすることです。:: +最も一般的なのは、オブジェクトの表記法を使ってエンティティー内のデータにアクセスすることです。 :: use App\Model\Entity\Article; @@ -78,12 +78,12 @@ CakeのORMを使うためにエンティティークラスを生成する必要 $article->title = 'This is my first post'; echo $article->title; -また、 ``get()`` と ``set()`` メソッドも使えます。:: +また、 ``get()`` と ``set()`` メソッドも使えます。 :: $article->set('title', 'This is my first post'); echo $article->get('title'); -``set()`` を使う時、一つの配列で複数のプロパティーを一度に更新できます。:: +``set()`` を使う時、一つの配列で複数のプロパティーを一度に更新できます。 :: $article->set([ 'title' => 'My first post', @@ -96,14 +96,14 @@ CakeのORMを使うためにエンティティークラスを生成する必要 セットできるかホワイトリストで制限するべきです。 アクセサーとミューテーター -==================== +========================== .. php:method:: set($field = null, $value = null) 加えて、シンプルな get/set インターフェイスのためには、エンティティーは アクセサーとミューテーターメソッドを提供することを許可します。 これらのメソッドは、プロパティーがどうやってセットされたり、読まれたりするかを -カスタマイズするために使えます。例えば、:: +カスタマイズするために使えます。例えば、 :: namespace App\Model\Entity; @@ -121,7 +121,7 @@ CakeのORMを使うためにエンティティークラスを生成する必要 それらは ``_properties`` にある基本的な値を引数としてのみ受け取ります。 アクセサーはエンティティーを保存する時に使われます。なので、データをフォーマットするメソッド を定義する時には気をつけましょう。プロパティーがどのように定義したミューテーターがセットした -情報を取得するかカスタマイズできます。:: +情報を取得するかカスタマイズできます。 :: namespace App\Model\Entity; @@ -141,7 +141,7 @@ CakeのORMを使うためにエンティティークラスを生成する必要 ミューテーターは常にプロパティーに保存された変数を返すようにすべきです。 また、上で見たように、ミューテーターを他のプロパティーを設定するために使えます。 -これをする時に、一切のループに突入しないように注意して下さい。Cakeはミューテーターの +これをする時に、一切のループに突入しないように注意して下さい。CakePHP はミューテーターの 無限ループを検出して防ぐことが出来ません。ミューテーターは簡単にプロパティーを 計算されたデータによって変換することを許可します。ミューテーターとアクセサーは プロパティーが、使用中のオブジェクト表記や get() と set() を使って読まれた時に適用されます。 @@ -150,11 +150,11 @@ CakeのORMを使うためにエンティティークラスを生成する必要 .. _entities-virtual-properties: 仮想プロパティーの生成 ---------------------------- +----------------------- アクセサーを定義することによって、現在存在しないプロパティへのアクセスを提供できます。 例えば、users テーブルが ``first_name`` と ``last_name`` 列を持っていたとして、 -フルネームのためのメソッドを作れるということです。:: +フルネームのためのメソッドを作れるということです。 :: namespace App\Model\Entity; @@ -172,7 +172,7 @@ CakeのORMを使うためにエンティティークラスを生成する必要 } エンティティーに存在するように仮想プロパティーにアクセスできます。 -プロパティー名は小文字と ”_” を使ってメソッド名を置き換えて表記します。:: +プロパティー名は小文字と ”_” を使ってメソッド名を置き換えて表記します。 :: echo $user->full_name; @@ -186,12 +186,12 @@ CakeのORMを使うためにエンティティークラスを生成する必要 エンティティー内でプロパティーが変更されてもされなくても、 コードを規約に沿ったものに保ちたいでしょう。例えば、フィールドが変更された時にだけ -バリデートしたい時に、:: +バリデートしたい時に、 :: // タイトルが変更された時に、. $article->dirty('title'); -フィールドに変更されたという印をつける事ができます。これはプロパティー配列に追加された時に便利です。:: +フィールドに変更されたという印をつける事ができます。これはプロパティー配列に追加された時に便利です。 :: // コメントを追加して、変更されたフィールドに印をつけます。 $article->comments[] = $newComment; @@ -200,27 +200,27 @@ CakeのORMを使うためにエンティティークラスを生成する必要 加えて、 ``getOriginal()`` を使ったオリジナルプロパティーの変数を元にした整ったコードを書けます。 このメソッドは実際の値をいじっても、常にオリジナルの値を返してくれます。 -このエンティティーで全てのプロパティーの変化をチェックできます。:: +このエンティティーで全てのプロパティーの変化をチェックできます。 :: // エンティティーが変更されたか確かめる $article->dirty(); -``clean()`` メソッドで不必要な印をエンティティーのフィールドから除去できます。:: +``clean()`` メソッドで不必要な印をエンティティーのフィールドから除去できます。 :: $article->clean(); -新しいエンティティーを作る時、他のオプションを渡すことによって、汚くマークされたフィールドを避ける事が出来ます。:: +新しいエンティティーを作る時、他のオプションを渡すことによって、汚くマークされたフィールドを避ける事が出来ます。 :: $article = new Article(['title' => 'New Article'], ['markClean' => true]); バリデーションエラー -================= +==================== .. php:method:: errors($field = null, $errors = null) :ref:`エンティティーの保存 ` がされた後、全てのバリデーションエラーは エンティティーそのものに保存されます。全てのバリデーションエラーに ``errors()`` メソッドを使って -アクセスできます。:: +アクセスできます。 :: // エラーの取得 $errors = $user->errors(); @@ -229,24 +229,24 @@ CakeのORMを使うためにエンティティークラスを生成する必要 $errors = $user->errors('password'); ``errors()`` はまたエンティティーにエラーをセットするために使われます。 -それは、エラーメッセージで動くコードをテストする時に使います。:: +それは、エラーメッセージで動くコードをテストする時に使います。 :: $user->errors('password', ['Password is required.']); .. _entities-mass-assignment: -Mass Assignment(一気に代入) -=============== +マスアサインメント (*Mass Assignment*) +======================================= 一度に沢山のプロパティーーを設定するのは簡単で便利です。 そして、これは重大なセキュリティー問題が伴います。 リクエストから沢山のユーザーデータをエンティティーに代入することは、 ユーザーが全ての列を操作できるように許可することです。 -anonymous エンティティークラスを使うと、CakePHP は mass-assignment からの影響を保護しません。 -:doc:`/bake` を使い自分のエンティティーを生成することで mass-assignment から保護します。 +anonymous エンティティークラスを使ったり、 :doc:`/bake` でエンティティーを生成すると +CakePHP はマスアサインメントからの影響を保護しません。 -``_accessible`` プロパティーは mass-assign かどうかにかかわらずプロパティーのマップを提供することを許可します。 -``true`` と``false`` で mass-assign できるかどうかを示します。:: +``_accessible`` プロパティーはマスアサインメントかどうかにかかわらずプロパティーのマップを提供することを許可します。 +``true`` と ``false`` でマスアサインメントできるかどうかを示します。 :: namespace App\Model\Entity; @@ -261,7 +261,7 @@ anonymous エンティティークラスを使うと、CakePHP は mass-assignme } 加えて、フィールドを具体化するために ``*`` という命名されていないフォールバックビヘイビアを定義する -特殊フィールド があります。:: +特殊フィールド があります。 :: namespace App\Model\Entity; @@ -278,19 +278,19 @@ anonymous エンティティークラスを使うと、CakePHP は mass-assignme ``*`` プロパティーが定義されていない場合、 ``false`` と設定されます。 -Mass Assignment に対する保護の回避 ------------------------------------ +マスアサインメントに対する保護の回避 +------------------------------------ -新しいエンティティーを ``new`` する時、 mass assignment に対して自信を保護しないように設定できます。:: +新しいエンティティーを ``new`` する時、マスアサインメントに対して保護しないように設定できます。 :: use App\Model\Entity\Article; $article = new Article(['id' => 1, 'title' => 'Foo'], ['guard' => false]); -ランタイムで保護されたフィールドを編集する ---------------------------------------- +動的に保護されたフィールドを編集する +------------------------------------ -``accessible`` メソッドで保護されたフィールドのリストを編集できます。:: +``accessible`` メソッドで保護されたフィールドのリストを編集できます。 :: // user_id にアクセスできるようにする $article->accessible('user_id', true); @@ -302,30 +302,30 @@ Mass Assignment に対する保護の回避 アクセス可能なフィールドへの編集はメソッドが呼んでいるインスタンスのみに影響する。 -``newEntity()`` と ``patchEntity()`` を ``Table`` オブジェクトで使う時、 mass assignment による保護を +``newEntity()`` と ``patchEntity()`` を ``Table`` オブジェクトで使う時、 マスアサインメントからの保護を カスタマイズして使えます。 :ref:`changing-accessible-fields` に詳細があります。 フィールドに対する保護をバイパスする ------------------------- +------------------------------------ -mass-assignment が保護されたフィールドへのアクセスすることを許可する必要に迫られる時があるでしょう:: +マスアサインメントが保護されたフィールドへのアクセスすることを許可する必要に迫られる時があるでしょう:: $article->set($properties, ['guard' => false]); ``guard`` オプションを ``false`` にすることで、 ``set()`` を呼ぶためのアクセス可能なフィールドリストを無視することが出来ます。 エンティティーが存続しているかチェックする ------------------------------------ +------------------------------------------ データベスに既に存在する行をエンティティーが表しているのか知る必要がある時があります。 -``isNew()`` でそれが分かります。:: +``isNew()`` でそれが分かります。 :: if (!$article->isNew()) { echo '既に保存されました!'; } 既にエンティティーが存続していることが分かっているときは -``isNew()`` をセッターとして使えます。:: +``isNew()`` をセッターとして使えます。 :: $article->isNew(false); @@ -333,25 +333,25 @@ mass-assignment が保護されたフィールドへのアクセスすること .. _lazy-load-associations: -Lazy Loading Associations -========================= +アソシエーションの Lazy ローディング +==================================== -eager loading associations は一般的に大雑把に関連データを読み込む時に +アソシエーションの eager ローディングは一般的に大雑把に関連データを読み込む時に 最も有効なアソシエーションへのアクセス法です。 -この方法を知る前に、 eager loading と lazy loading の違いを見てみましょう。: - -Eager loading - は できるだけ *少ない* クエリでDBから情報を取得できるようにJOINを(可能なときは)使います。 - HasMany アソシエーションを使うような分割したクエリが必要なときは、1つのクエリで *全部* の - 現在のオブジェクトのセットとの関連データが取ってこられるようにします。 -Lazy loading - Lazy loading はロードを必要な時まで遅延させます。 +この方法を知る前に、 eager ローディングと lazy ローディングの違いを見てみましょう。: + +Eager ローディング + できるだけ *少ない* クエリでDBから情報を取得できるようにJOINを(可能なときは)使います。 + HasMany アソシエーションを使うような分割したクエリが必要なときは、1つのクエリで *全部* の + 現在のオブジェクトのセットとの関連データが取ってこられるようにします。 +Lazy ローディング + ロードを必要な時まで遅延させます。 不必要なデータがオブジェクトに吸い上げられるのを防ぐことで処理を減らします。でも、沢山のクエリがDBに送られる可能性がありま - 例えば、 複数のarticles と それに属する複数の comments でループしている時に - articleの数のクエリが打たれます。 + 例えば、 複数の articles と それに属する複数の comments でループしている時に + article の数のクエリが打たれます。 -CakePHP の ORMにlazy loadingが含まれていない時、必要な時にこれを操作することは難しくないです。 -アクセサメソッドを使っている時には、関連データを lazily load 出来ます。associated data:: +CakePHP の ORM に lazy ローディングが含まれていない時、必要な時にこれを操作することは難しくないです。 +アクセサメソッドを使っている時には、関連データを lazily ローディング出来ます。 :: namespace App\Model\Entity; @@ -371,7 +371,7 @@ CakePHP の ORMにlazy loadingが含まれていない時、必要な時にこ } -上記のメソッドを使うことで、以下のことができるようになります。:: +上記のメソッドを使うことで、以下のことができるようになります。 :: $article = $this->Articles->findById($id); foreach ($article->comments as $comment) { @@ -379,17 +379,17 @@ CakePHP の ORMにlazy loadingが含まれていない時、必要な時にこ } トレイトを使った再利用可能なコードの生成 -=================================== +======================================== いくつかのエンティティークラスで同じロジックを使っていることがあります。 -PHP のトレイトはこの時に威力を発揮します。 **src/Model/Entity** にトレイトを置けます。 +PHP のトレイトはこの時に威力を発揮します。 **src/Model/Entity** にトレイトを置けます。 命名規則に沿ったトレイトは ``Trait`` によってサフィックス(を個別の名前に加える)されます。 -インターフェイスやクラスから、簡単に呼ぶことが出来ます。トレイトはビヘイビアにテーブルとエンティティーオブジェクト -を機能的に上手に提供することが出来ます。 +インターフェイスやクラスから、簡単に呼ぶことが出来ます。 +トレイトはビヘイビアにテーブルとエンティティーオブジェクトを機能的に上手に提供することが出来ます。 例えば、 SoftDeletable プラグインを使っていたとして、それはトレイトを生成できます。 -このトレイトは. 'deleted' とエンティティーをマークするための、トレイトによって生成された ``softDelete`` メソッドを -提供できます。:: +このトレイトは. 'deleted' とエンティティーをマークするための、トレイトによって生成された +``softDelete`` メソッドを提供できます。 :: // SoftDelete/Model/Entity/SoftDeleteTrait.php @@ -404,7 +404,7 @@ PHP のトレイトはこの時に威力を発揮します。 **src/Model/Enti } -エンティティークラスにインポートするかインクルードしたトレイトを使えます。:: +エンティティークラスにインポートするかインクルードしたトレイトを使えます。 :: namespace App\Model\Entity; @@ -416,10 +416,11 @@ PHP のトレイトはこの時に威力を発揮します。 **src/Model/Enti use SoftDeleteTrait; } -配列/JSON の生成 -========================= +配列や JSON への変換 +==================== -APIを作る時、配列はJSONにエンティティーを変換するときにCakePHPでは以下のように簡単にできます。:: +API を作る時、しばしば、エンティティーを配列や JSON に変換する必要があるでしょう。 +CakePHP では以下のように簡単にできます。 :: // Get an array. $array = $user->toArray(); @@ -427,17 +428,17 @@ APIを作る時、配列はJSONにエンティティーを変換するときにC // Convert to JSON $json = json_encode($user); -配列/JSONに変換する時に、仮想または、 hidden フィールドリストに適用されます。 +配列や JSON に変換する時に、仮想または、 hidden フィールドリストに適用されます。 -エンティティは一気に変換されます。この意味は、 eager loaded されたエンティティーとアソシエーションは +エンティティは一気に変換されます。この意味は、 eager ローディングされたエンティティーとアソシエーションは CakePHP が正しくフォーマットに関連付けられたデータをして変換してくれるということです。 仮想プロパティーの出力 ---------------------------- +----------------------- -デフォルトの仮想プロパティーでは配列/JSONに変換した時にエクスポートされません。 +デフォルトの仮想プロパティーでは配列や JSON に変換した時にエクスポートされません。 仮想プロパティーを出力するためには見える形にしなきゃいけません。 -エンティティークラスを定義する時に、出力されるべき仮想プロパティーのリストを提供できます。:: +エンティティークラスを定義する時に、出力されるべき仮想プロパティーのリストを提供できます。 :: namespace App\Model\Entity; @@ -450,15 +451,15 @@ CakePHP が正しくフォーマットに関連付けられたデータをして } -このリストはランタイムで ``virtualProperties`` を使うことで編集できます。:: +このリストは、実行時に ``virtualProperties`` で編集できます。 :: $user->virtualProperties(['full_name', 'is_admin']); プロパティーを隠す ------------------ +------------------ JSON/配列フォーマットで出力したくないフィールドがある場合があります。例えば、 -パスワードとか”秘密の質問”とかです。エンティティークラスを定義する時、どのプロパティーを隠すか設定できます。:: +パスワードとか”秘密の質問”とかです。エンティティークラスを定義する時、どのプロパティーを隠すか設定できます。 :: namespace App\Model\Entity; @@ -471,15 +472,16 @@ JSON/配列フォーマットで出力したくないフィールドがある場 } -このリストは、 ``hiddenProperties`` で編集できます。:: +このリストは、実行時に ``hiddenProperties`` で編集できます。 :: $user->hiddenProperties(['password', 'recovery_question']); 複数のタイプをソート -===================== +==================== -エンティティーのアクセサーとミューテーター はデータベースから来た複雑なデータをシリアライズまたはデシリアライズ -するロジックを含むように想定されていません。 :ref:`saving-complex-types` を複雑なデータタイプをどうやって配列やオブジェクトのように保存するのかを理解するために参照して下さい。 +エンティティーのアクセサーとミューテーターはデータベースから来た複雑なデータをシリアライズ +またはデシリアライズするロジックを含むように想定されていません。 :ref:`saving-complex-types` を +複雑なデータタイプをどうやって配列やオブジェクトのように保存するのかを理解するために参照して下さい。 .. meta:: :title lang=ja: エンティティー