ソフトデリート

参考

Laravel 5.3 Eloquent:利用の開始

概要

laravelのEloquentではモデルのソフトデリートを行うことができる。

ソフトデリートとはいわゆる論理削除のことで物理削除のように実際にデータを削除するわけではないが該当のデータを削除したものをして取り扱うことをいう。

準備

具体的にはそのモデルのレコードのdeleted_at属性にdate型の値をセットすることでこれを行う。前提としてモデルのテーブルのカラムにdeleted_atがあり、またモデルクラスでIlluminate\Database\Eloquent\SoftDeletesトレイトをuseしておく必要がある。

migrationでdeleted_atを追加するためのメソッドも用意されている。

Schema::table('users', function ($table) {
    $table->softDeletes();
});

使い方

ソフトデリートのために準備されたモデルにdeleteメソッド使うとdeleted_atにその時点の時刻が入り論理削除済みとなる。deleted_atがnullでないレコードはクエリの対象とならない。インタンスに対してtrashed()メソッドを実行するとソフトデリート済みかどうかの結果がブーリアンで返ってくる。

ソフトデリートは常にクエリの対象とならないがあえて含めたい場合にはstatic functionのwithTrashedを使ってクエリを作ればそれができる。これはリレーションのチェーンメソッドとしても使うことができる。

さらにonlyTrashedメソッドを使えば論理削除済みのアイテムのみを選ぶこともできる。

論理削除からインスタンスを復活させるにはそのインスタンスに対してrestore()メソッドをかける。これもリレーションに対して使用できる。

反対に完全削除をかける時にはforceDelete()をインスタンスにかける。

外部キー制約を付けるときのマイグレーションで気をつけること

要約

外部キー制約を設定するときは外部キーにunsigned制約を付ける。

外部キーと対象のプライマリーキーが完全に同じ型である必要があって、プライマリーキーには自動的にunsignedがかかっているから。

エラー内容

Illuminate\Database\QueryException : SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

constraintは制約の意味。sql的に一般的にエラーだよと言っている

migration file

例えば下記のようにしておく。

$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

修正が面倒なのでもう間違えたくない。

外部キー制約の付与に失敗しているがテーブルは作られている。

なので修正してmigrateすると「もうテーブルあるよ」のエラーがでる。

resetとかしてもこのrollbackだけ効かなかったりして面倒だが直接テーブルを削除することでやり直した。

トレイト

参考

トレイト

概要

  • コードをまとめて再利用するための仕組み。
  • メソッドをまとめて書いておき、使用したいクラスで呼び出すことでそのクラスでメソッドを定義したかのように使用することができる。
  • クラスに似ているがトレイト自身のインスタンスを作ることはできない。

使い方

  • 下記のように定義できる
trait someMethods {
    function getSomething() 
    function getSomethingElse() 
}
  • 下記のように呼び出せる
class somethingController{
    use someMethods;
}

使われ方

ソースコードを読んでいてそのクラスのなかに呼び出されているはずのメソッドが見当たらない時はuseで参照されているトレイトにある可能性がある。

クエリビルダ

参考

PHPフレームワーク Laravel Webアプリケーション開発 バージョン5.5 LTS対応

概要

クエリビルダはsqlを作って実行するための仕組み。

Eloquentも内部的にクエリビルダのインスタンスを持っている。

メソッド

sqlの関数に即したメソッドを持っている。

select, where, leftJoin, orderBy などのメソッドはクエリビルダのインスタンス(Illuminate\Database\Query\Builder)を返り値として返す。

またこの時点ではsqlは実行されない。

sqlが実行されるのはget()やfirst()が実行されるとき。

この結果はEloquentモデルのインスタンスとして返ってくる。

構文

  1. クエリビルダオブジェクトの取得
  2. メソッドチェーンでSQLを作成
  3. 実行してEloquentモデルのインスタンスを取得
クエリビルダをDBファサードから取得する方法
 $query = DB::table('users');
メソッド覚書

where系のメソッドは連続して繋げるとand条件になる。or条件を使いたい場合はwhere()にorWhereをつなげる。

join系のメソッドを使うことで条件に当てはまらないレコードはこの時点で弾くことができる。

クエリの実行・データの取得
  • get()

    • 全てのデータを取得する

    • object(Illuminate\Database\Eloquent\Collection)

  • first()

    • 最初の一行を取得する

    • object(App\User)など具体的なモデルインスタンス

要件の確認について

手戻りを最小限にするために重要

はっきりとわからないことがあるときはそれが明確になるまで別の言い方で質問して確認するようにする。自分の理解を自分の言葉で伝えて間違いを指摘してもらえるようにする。当然ながら自分がどういう風に理解しているかは相手はわからない。

 分かっているつもりでも質問する

はっきり分かっているつもりでも質問する。分かっているつもりで分かっていないことがよくあるから。自分が何も分かっていないことを前提にする。

 知ったかぶり

無意識のうちに知ったかぶりをしている場合もある。していないつもりでも。

また、相手も前提としている知識を共有していると思い込んでいる場合がある。当たり前のように話している中に少しでも引っかかるところがあれば積極的に質問して教えてもらうようにすべき。

デバッグについて

ブラウザ

var_dump();die();

  • viewを返す場合。
  • ()内の値を確認できる
  • dd()でも可。
  • laravelというよりもphp

{{var_dump()}} {{die()}}

  • blade内の値を確認する場合

die('ok');

  • プログラムがどこまで進んでいるかを確認することができる。

    • エラーが出ずにokが出力されれば、エラーの出る場所を特定しやすくなり、問題の切り分けがしやすくなる。

chrome 検証ツール

  • option + command + i
  • どんな通信が走っているか確認できる。
  • Network→XHRでapi一覧表示
  • あるいはelementsでonclickイベントの対象となるid等を取得して走るapiを追うこともできる。
  • Preserve log にチェックを入れるとすぐにリダイレクトされるviewのapiも消えずに残るので確認がしやすい
  • 逆にチェックを入れておけば、apiの叩かれるタイミングがわかりやすくなる。
  • clearで溜まったlogを削除することができる
  • Nameにカーソル合わせてURL確認
  • 選択して詳細表示
  • Previewでレスポンス値確認
  • Responseでjsonが返る場合JSONきれい ~JSON整形ツール~で整形できる
    • apiでvar_dumpの値を直接表示することができない場合でもこのpreviewから確認することができる。
    • 500エラーなどの場合は何も表示されない。

Restlet Client - REST API Testing

  • apiの通信を確認する

  • response

    • previewからvar_dumpを確認することもできる

Laravel Debugbar

下記のそれぞれは右側のフォルダのアイコンからリクエストごとに確認することができる。 - messages - \Debugbar::info(); - info()の引数に変数などを入れて値を確認することができる。 - 役割的にはvar_dump();と同じ。 - exceptions - エラーメッセージが表示される。 - Queries - 走ったクエリが確認できる。 - クエリはSequel Pro で実行し値の確認ができる

Logging

/storage/logsに出力する

これでもブラウザを介さず値の確認ができる。 出力の方法

use Illuminate\Support\Facades\Log;
Log::info('ok');

もしくは

logger('ok');

結果は同じ

[2019-02-18 23:30:51] local.DEBUG: ok

use Illuminate\Support\Facades\Log; が必要ない分logger();の方が楽かもしれない。

/storage/logs以下の出力の粒度についてはconfig/app.phpで設定できる。

'log' => 'daily'

gitまとめ

参考:git--local-branching-on-the-cheap

  • gitとは?

    • ソースコードのバージョン管理のためのソフトウェア。
    • コマンドでソースコードの状態を以前の状態に戻したり、同じソースコードを異なるバージョンとして管理することができる。
    • リモートレポジトリへgit管理下のソースコードをpushすることでそれを他の人と共有することもできる。
  • リモートレポジトリとは?

    • クラウド上にあるソースコードを管理するための領域
    • ローカルのgitと同期して管理することができる。
    • ソースコードがおいてあるのでローカルの状態と関係なくpullすればそのソースコードをローカルで再現することができる。この仕組みを利用してチームでの開発をスムーズに行うことができる。リモートレポジトリを経由してソースコードの改変を他者と共有することができる。また、gitのブランチ機能を利用して開発を並行して行うこともできる。
  • pullとは?

    • pullとはoriginからソースコードを引っ張ってきてローカルレポジトリのソースコードと差異がある場合にその差分をローカルレポジトリに反映させること。
    • pullはローカルリポジトリのワーキングツリーやステージにファイルのある状態では実行することができない。
    • gitにはワーキングツリー・インデックス・HEADの三つの領域がある。
    • git pull origin ブランチ名
  • ワーキングツリーとは?

    • 人間が直接触って編集することのできる領域。
    • ここでファイルを編集して動きを確認することができる。
    • gitではファイルの集まりのことをツリーと表現する。ツリーとはデータの構造のことではない。
  • ステージとは?

    • HEADに移行する前段階のこと。
    • インデックスとも呼ばれる。
    • git add
    • addされるとインデックスの状態が変化する。
  • HEADとは?

    • HEADとは最新のコミット状態を指し示すポインタのようなものである。
    • ステージからgit commit することでHEADを変更することができる。
    • HEADのソースコードはpushすることでリモートレポジトリに反映させることができる。
  • スタッシュとは

    • 前述ようにステージやワーキングツリーにファイルがあるとgit pullすることができない。
    • git checkout して他のブランチでの作業を行うと現在のワーキングツリーの情報が失われてしまう。
    • 作業途中の状態でcommitしたくない。
    • 上記のような時にスタッシュを行うことで作業中のファイルやステージのファイルを隠して取っておくことができる。
  • ブランチとは?

    • git管理下の領域のファイルに並行して別の変化を加え、そのバージョン管理を行うための仕組み。
    • 異なるブランチ同士は同じ名前でもとは同じ一つのファイルであっても、別のファイルであるかのように扱うことができる。
    • リモートリポジトリでもそれぞれ対応するブランチを作成し、それぞれが同期するように扱うことができる。
    • 枝分かれさせて開発しているブランチはそのブランチでの開発が完了した時に別のブランチにマージして、終了することができる。
    • pushやpullもブランチ単位で行う。
    • pullした時にコンフリクトが起こることがある。
  • コンフリクトとは?

    • pullしたリモートのブランチのHEADがローカルのHEADの同一箇所で異なる状態であること。
  • pushとは?

    • ワーキングツリーのソースコードはまずaddすることでステージに移行できる。
    • ステージにあるファイルはcommitすることでローカルレポジトリに移行することができる。
    • commitされローカルリポジトリに移行したファイルはその時点の状態がgitのバージョン管理の対象となる。
  • gitのバージョン管理とは?

    • 最新のバージョンのことをHEADと呼ぶ。
    • HEAD以前のバージョンにはハッシュ値が付与されている。
    • git resetやrevertで過去の状態に戻すことができる。
  • resetとは?

    • git reset soft

      • HEADの位置を指定の位置まで戻す。
    • git rese mixed

      • HEADの位置とステージの状態を指定の位置まで戻す。
    • git reset hard

      • HEADの位置とステージの状態とワーキングツリーの状態(変更)を指定の位置まで戻す。
      • hardを使う時には注意が必要。
      • 他のオプションと異なり、ワーキングツリーの状態まで変化するためやり直しがきかない。
    • resetの対象のファイルの指定

      • ファイルを指定する場合にはHEADの位置の変更はできない。(reset hardはできない)
      • インデックスのファイルをHEADの状態に戻したりすることができる。
    • 戻る位置の指定方法

      • 最新のコミット

        • HEAD
        • 現在のHEADの位置
      • 一つ前のHEADの位置

        • HEAD^
        • HEAD~
      • 二つ以上前のHEADの位置

        • HEAD^^
        • HEAD~~
        • HEAD~2