LoginSignup
0
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-01-21

ふくだ学習録とは?

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

読了した本

データベースエンジニア養成読本 [DBを自由自在に活用するための知識とノウハウ満載!]
ゼロから作るDeepLearning

今読んでいる本

PHPフレームワーク CakePHP 3入門

CakePHP3入門を読んで

外部キーの命名規則

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

CakePHPのJOIN

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

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

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

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

hasOneによる1対1結合

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

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

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について

Eager Loadを行うためのcontain

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

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

hasManyによる1対t多結合

hasMany();メソッドを使用する。

関連付けされている側からの参照 belongsTo

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

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

TableRegistryについて

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

HTMLヘルパー

キャラクタセットの指定

$this->Html->charset('utf-8');

↓出力

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

スタイルシートの指定

$this->Html->css('hello');

↓出力

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

METAタグ

$this->Html->meta( タイプ, URL, 属性指定 );

タイプ
METAタグの種類

URL
URLの指定

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

__( テキスト )表記に関して

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

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

$ bin\cake i18n

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

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

msgid "メッセージID"
msgstr "翻訳するテキスト"

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

②各国語のリソースファイルを用意する

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

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

デフォルトの言語設定

app.php内に記載されている、

env('APP_DEFAULT_LOCALE', 'ロケール値')

という部分の「ロケール値」をja_JPなどのように書き直す.

ナビゲーションリンクのカスタマイズ

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

①my-paginator-temp.phpの作成

configフォルタ内に、my-paginator-temp.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で下記の記載をする。

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

今日の一言

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

PHP による hello world 入門

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0