【ふくだ学習録】CakePHP3入門 part4【13日目】

# ふくだ学習録とは？
ふくだが学習したことの備忘録。
目に見える形で残すことによってやる気を出す個人的な作戦です。
他人に見せるように書いているわけではないので、すごく読みにくいです。

### 読了した本
[データベースエンジニア養成読本 [DBを自由自在に活用するための知識とノウハウ満載!]](https://www.amazon.co.jp/dp/4774158062/ref=cm_sw_r_tw_dp_U_x_FPphEbQFPPQRM )
[ゼロから作るDeepLearning](https://www.amazon.co.jp/dp/4873117585/ref=cm_sw_r_tw_dp_U_x_y3UiEbF3P6EG7)

### 今読んでいる本

[PHPフレームワーク CakePHP 3入門](https://www.amazon.co.jp/dp/4798048577/ref=cm_sw_r_tw_dp_U_x_.YIjEbS1K4JY2)

# CakePHP3入門を読んで

### 外部キーの命名規則
外部キーは、`エンティティ名_id`といった名前でつける。
例えば。boardsテーブルに外部キーを作り。peapleテーブルを関連づける場合、`person_id`という名前で外部キーフィールドを作成する。
※テーブル名（複数形）ではなくエンティティ名（単数形）になるところを注意。（まぁレコード単位で結びつけるわけやから妥当）

### CakePHPのJOIN
テーブルを連携するJOINコマンドにはいくつかの種類がある。

**LEFT JOIN**
元となるテーブルを左側におき、右側にテーブルを結合させる。
左側のテーブルでは、右側に結合対象のレコードがなくても全て表示する。

**RIGHT JOIN**
元となるテーブルを右側におき、左側にテーブルを結合させる。
右側のテーブルでは、左側に結合対象のレコードがなくても全て表示する。

**INNER JOIN**
左右両方のレコードが存在するレコードのみが表示される。

### hasOneによる1対1結合
１対１の関係の時に`hasOne()`を用いて結合できる。
※結合先に対となるレコードがない場合、空のレコードが設定される。

元テーブル側に、下記の記載を行う。

```php:
public function initialize(array $config){
  this->hasOne( 関連テーブル, 連想配列 );
}

# 連想配列には下記のようなものを入れる。
[
  'className' => 'クラス名',
  'conditions' => '設定の連想配列',
  'sort' => '並び順の指定',
  'dependent' => '削除設定の真偽値', # レコード削除した時に、結合側のレコードも消すかどうか
  'joinType' => 'JOINタイプの指定', # LEFT JOINか、INNER JOINかを指定する。 
  'foreignKey' => 'キーとなるフィールド名' # 結合先のキーとなるフィールド名を指定する。
]
```

### Eager Loading、Lazy Loadingとは？
**Eager Loading**
アソシエーションで関連付けされたテーブルをJOIN結合して、データを取得する。
複雑なクエリ（1回のクエリで様々な処理を行う）場合に使用される。
ただしメモリを大量に使うことになるので、多対多の関係には使用しないようにするべき。

**Lazy Loading**
アソシエーションで関連付けされたテーブル情報に関しては、必要なタイミングで直接そのテーブルにクエリを投げる手法。つまりJOIN結合は行わない。
そのためメモリの使用量は少なくなるが、動作がもっさりする可能性がある。

[ORM の eager loading と lazy loadingについて](https://blog.withnic.net/2015/08/orm-%E3%81%AE-eager-loading-%E3%81%A8-lazy-loading%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/)

### Eager Loadを行うためのcontain
`contain()`メソッドを使用することで、関連データをEager Loadingして取得できるようになる。

```php
->contain(['Boards']); # BoardsテーブルをJOIN結合させている。
```

### hasManyによる1対t多結合
`hasMany();`メソッドを使用する。

### 関連付けされている側からの参照 belongsTo
関連付けされている側からは、`belongsTo();`と記述して元のテーブルのレコード情報を取得していく。

```php:
public function initialize(array $config){
  this->belongsTo( 元テーブル, 連想配列 );
}
```

### TableRegistryについて
TableRegistryは、テーブルの登録を行うクラスで、getは引数に指定したテーブルを取得し使えるようにする。
Cakeは命名規則から、テーブルとコントローラの関係性を判断するため。コントローラから違う名前のテーブルを使用しょうとしても使えない。そのため`TableRegistry::get('People')`といった記載をすることで、テーブルを使用できるようにする。

### HTMLヘルパー

#### キャラクタセットの指定

```php
$this->Html->charset('utf-8');
```
↓出力

```html
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
```


#### スタイルシートの指定

```php
$this->Html->css('hello');
```
↓出力

```html
<link rel="stylesheet" type="text/css" href="/cake3app/css/hello.css">
```

#### METAタグ

```php
$this->Html->meta( タイプ, URL, 属性指定 );
```
**タイプ**
METAタグの種類

**URL**
URLの指定

**属性指定**
タグに用意する各種の属性。属性名をキーとする連想配列として格納する。

### __( テキスト )表記に関して
CakePHPでは、`<?= __('テキスト') ?>`といった表記で記載することによって、そのテキスト部分を必要に応じて翻訳してくれる。翻訳データがなかったりした場合は、カッコ内のテキストが表示される。

#### ①翻訳データを記述したリソースファイルの作る。

```console
$ bin\cake i18n
```
を実行して、ファイル作成のためのプログラムを実行していくと、指定したディレクトリに`default.pot`というファイルができる。

ここには下記のような記載がされている。

```php
msgid "メッセージID"
msgstr "翻訳するテキスト"
```
この「メッセージID」が、`__()`内に記載したもの。
また「翻訳するテキスト」と記載している部分がデフォルトの翻訳データになる。

#### ②各国語のリソースファイルを用意する
翻訳のリソースファイルは、デフォルトでは`src/Locale`配下にできる。
そのLocale配下に、さらにそれぞれの言語用にフォルダとリソースファイルを作成する。

例えば「日本語」と「英語」の2つを用意する場合は、`src/Locale/ja_JP`と`src/Locale/en_US`というフォルダを作成して、それぞれのフォルダに先ほどの`default.pot`をコピーして名前を`default.po`に変更したファイルを格納する。
その後、それぞれのファイルの`msgstr`部分を翻訳したい言葉に書き換える。

### デフォルトの言語設定
`app.php`内に記載されている、

```php
env('APP_DEFAULT_LOCALE', 'ロケール値')
```
という部分の「ロケール値」を`ja_JP`などのように書き直す.

### ナビゲーションリンクのカスタマイズ
Paginatorを使用すると、簡単にページ移動リンクを作成できるが、タグ構造やスタイル変更は少し難しくなってしまう。独自カスタマイズをしたい場合は、専用のテンプレートを用意し、Viewクラスで読み込むことで対応できる。


#### ①my-paginator-temp.phpの作成
`config`フォルタ内に、`my-paginator-temp.php`という名前でファイルを作成する。
ファイル内は、下記のように記載する。

```php
<?php
return [
  'number' => '<span style="border:solid">
                 <a href="{{url}}">
                   {{text}}
                 </a>
               </span>',
  'current' =>'<span style="border:solid">
                 {{text}}
               </span>' 
];
```

#### ②Viewクラスでテンプレートをロードする
`src/View/AppView.php`で下記の記載をする。

```php:AppView.php
public function initialize() {
  $this->loadHelper('Paginator', ['templates' => 
    'my-paginator-temp']);
}
```



# 今日の一言
理解していることが増えてきたし、概念的な部分は終わってきたから、記載量減ってきた！いい兆候！
あとはphp実行時の流れをもう一度理解したい！下記記事がいいとのことだったので、これを読む！

[PHP による hello world 入門](http://tech.respect-pal.jp/php-helloworld/)