Omelet Reference(Draft) 4

エンティティ

エンティティは、詰め込んだ値をDAOのパラメータとして渡したり、結果セットを詰め替えて返すために用いるオブジェクトです。

エンティティの定義

エンティティはドメイン同様クラスですが、ドメインとは異なり何か別のクラスを継承する必要はありません。

ただし、エンティティとして定義するためには、以下の条件を満たす必要があります。

  • エンティティのフィールドは、プリミティブな型か、もしくはドメインのみ。
  • エンティティのフィールドは public のアクセス制限が必要。
  • public として公開された、引数なしのコンストラクタが存在すること。

以下はプリミティブ値として使用可能な型です。

  • 文字列(string)
  • 整数(integer / int)
  • 論理型(boolean / bool)
  • 不動小数点数(float / double)
  • タイムゾーンなし日時(DateTime)

フィールドの型は、ドキュメントコメントで指定します。指定がない場合、 string であると仮定します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Todo {
  /**
  * @var integer
  */
  public $id;

  /**
  * @var string
  */
  public $todo;

  /**
  * @var DateTime
  */
  public $createdAt;

  /**
  * @var Hidden
  *
  * Hiddenというドメインが定義されているとする
  */
  public $hidden;
}

上の例で、コンストラクタを定義していないですが、その場合デフォルトコンストラクタが自動的に用意されるため、問題ないです。

エンティティフィールドの別名

エンティティをDAOのパラメータや、結果セットの詰め替え先として用いることができます。

しかし、必ずしも、パラメータ名や結果セットの列名と一致させることができるとは限りません。

そのために、エンティティのフィールドに対して別名を設定することができます。

別名の設定は、ドメイン同様 @Omelet\Annotation\Column アノテーションを使用します。

1
2
3
4
5
6
7
8
9
10
11
use Omelet\Annotation\Column;

class Todo {
  /**
  * @Column(alias="todo_id") 
  *
  * @var integer
  */
  public $id;
...
}

エンティティフィールドの規定値

@Column アノテーションは、結果セットに該当の列が存在しない時に適用される規定値を指定することができます。

1
2
3
4
5
6
/**
 * @Column(default="nothing")
 *
 * @var string
 */
public $todo;
  • 現在クラスのフィールドに定義された規定値は無視しています
1
2
3
4
5
6
/**
 * @Column(alias="some_val") 
 *
 * @var integer
 */
public $someValue = 0; // 結果セットに列がない場合でも、この値は使用されない

ドメインの関数従属値の指定

結果セットの値をエンティティに詰め込む際、フィールドにドメインが存在し、そのドメインが関数従属の値を受け入れる場合、 @Column アノテーションで、その列名を指定することができます。

1
2
3
4
5
6
7
8
/**
 * @Column(alias="edit_user_id", optFields={"edit_user_name", "edit_user_initial_name"})
 *
 * @var Editor
 *
 * Editorには関数従属としてname, short_nameがあるとする
 */
 public $editor;

@Column の optFields に宣言した順に、ドメインのコンストラクタに渡されることに注意してください。