Play Framework勉強めも　複数Modelの連携／2種類のModelを作成する

（参考）勉強してる書籍
https://www.amazon.co.jp/Play-Framework-2%E5%BE%B9%E5%BA%95%E5%85%A5%E9%96%80-Java%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%ABWeb%E9%96%8B%E7%99%BA-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798133922/ref=cm_cr_srp_d_product_top?ie=UTF8


#Model
##Member
名前、メールアドレス、電話番号などの投稿者メンバーの情報を保管する。

```java
package models;

import javax.persistence.*;

import com.avaje.ebean.annotation.*;

import play.db.ebean.*;
import play.db.ebean.Model.Finder;

import java.util.*;

import play.data.validation.Constraints.*;

@Entity
public class Member extends Model {

	@Id
	public Long id;

	@Required(message = "必須項目です。")
	public String name;

	@Email(message = "メールアドレスを記入ください。")
	public String mail;

	public String tel;

	public static Finder<Long, Member> find = new Finder<Long, Member>(Long.class, Member.class);

	@Override
	public String toString() {
		return ("[id:" + id + ",name:" + name + ",mail:" + mail + ",tel:" + tel + "]");
	}

	public static Member findByName(String input) {
		return Member.find.where()
				.eq("name", input).findList().get(0);
	}
}

```

##Message
投稿者名、投稿メッセージ、作成日時をなどの情報を保管する。

```java
package models;

import java.util.*;
import javax.persistence.*;

import com.avaje.ebean.annotation.*;

import play.db.ebean.*;
import play.data.validation.Constraints.*;

@Entity
public class Message extends Model {

	@Id
	public Long id;

	@Required(message = "必須項目です。")
	public String name;

	@Required(message = "必須項目です。")
	public String message;

	@CreatedTimestamp
	public Date postdate;

	public static Finder<Long, Message> find = new Finder<Long, Message>(Long.class, Message.class);

	@Override
	public String toString() {
		return ("[id:" + id + ",name:" + name + ",mail:" + mail + ",message:" + message + ",date:" + postdate + "]");
	}

	public static Message findByName(String input) {
		return Member.find.where()
				.eq("name", input).findList().get(0);
	}
}
```

##補足
###●なぜModelの中にメソッドを記述するのか
Aplicationに記載するという手段もあったが、Model関係の機能はModelに記述を統一するため。

###●findByNameとは
引数に指定した、nameのMessageを返すメソッド。

###●findByNameメソッドの「eq」とは
`変数=<ExpressionList>.eq(フィールド名,値)`
引数に指定した、「フィールド」の中で、「値」と等しいものをExpressionListとして返す。

###●findByNameメソッドの「where」と「findList」について
where：ExpressionListを取り出す。
findList：ExpressionListに保管されているエンティティをリストとして取り出す。
※なぜ一度、「ExpressionList」で取り出すのか
→ExpressionListは、リストの要素を絞り込んだり、並びを調整したりするメソッドが用意されているため。

###●Finderクラスのインスタンス作成
`new Finder<プライマリキー、エンティティ>=（プライマリキー.class、エンティティ.class）;`
こうして作成したインスタンスをスタティックに保管し、必要に応じてそのメソッドでエンティティを取り出す。

#route
```
GET     /assets/*file               controllers.Assets.at(path="/public", file)

GET     /                           controllers.Application.index()
GET     /add                        controllers.Application.add()
POST    /create                     controllers.Application.create()
GET     /add2                       controllers.Application.add2()
POST    /create2                    controllers.Application.create2()
```

#View
##add
```
@(msg:String,form1:Form[models.Message])

@main("Sample Page"){

  <h1>ADD MESSAGE</h1>
  <p>@msg</p>
  @helper.form(action = routes.Application.create){

  @(helper.inputText(
    field = form1("name")
  ))

  @(helper.textarea(
    field = form1("message")
  ))

  <input type="submit">
  }
}
```
##add2
```
@(msg:String,form1:Form[models.Message])

@main("Sample Page"){

  <h1>ADD MEMBER</h1>
  <p>@msg</p>
  @helper.form(action = routes.Application.create2){

  @(helper.inputText(
    field = form1("name")
  ))

  @(helper.inputText(
    field = form1("mail")
  ))

  @(helper.inputText(
    field = form1("tel")
  ))

  <input type="submit">
  }
}
```
##補足
###●helper.inputTextとは
helperパッケージのinputTextオブジェクトの呼び出し。


#controllers
##Aplication
```java
package controllers;

import models.*;
import java.util.*;
import com.avaje.ebean.ExpressionList;

import play.*;
import play.data.*;
import play.data.validation.Constraints.Required;
import play.db.ebean.*;
import play.mvc.*;

import views.html.*;

public class Application extends Controller {
	//ルートにアクセスした際のAction
	public static Result index() {
		List<Message> datas = Message.find.all();
		List<Member> datas2 = Member.find.all();
		return ok(index.render("データベースのサンプル", datas, datas2));
	}

	//Message Action =============================

	//新規フォームのAction
	public static Result add() {
		Form<Message> f = new Form(Message.class);
		return ok(add.render("投稿フォーム", f));
	}

	// /createにアクセスした際のアクション
	public static Result create() {
		Form<Message> f = new Form(Message.class).bindFromRequest();
		if (!f.hasErrors()) {
			Message data = f.get();
			data.save();
			return redirect("/");
		} else {
			return ok(add.render("ERROR", f));
		}
	}

　　　　　　　　//Member Action =============================

	//メンバー作成フォームのAction
	public static Result add2() {
		Form<Member> f = new Form(Member.class);
		return ok(add2.render("メンバー登録フォーム", f));
	}

	// /create2にアクセスした際のAction
	public static Result create2() {
		Form<Member> f = new Form(Member.class).bindFromRequest();
		if (!f.hasErrors()) {
			Member data = f.get();
			data.save();
			return redirect("/");
		} else {
			return ok(add2.render("ERROR", f));
		}
	}
}
```

##画面
###**「home画面」**
<img width="394" alt="スクリーンショット 2018-05-03 14.00.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/229025/601176e8-1524-7782-8f72-e632e3221873.png">

###**「add」**
<img width="289" alt="スクリーンショット 2018-05-03 14.00.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/229025/0e88c042-c51d-db5e-cbee-725fef6fdf1a.png">

###**「add2」**
<img width="266" alt="スクリーンショット 2018-05-03 14.01.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/229025/90eaf5e5-6b16-d7e1-30f4-fe3fc2bd952b.png">