PHP/Elixirエンジニアのブログ

有益なアウトプットを心がけます。

【Elixir】基礎文法 - その壱 -

Elixirスクリプトの実行

n = 1
n = n + 1
IO.puts n

#出力結果
# 2
変数

まず、1行目。

n = 1

nは変数です。
Rubyとは異なりElixirにはローカル変数、インスタンス変数、クラス変数などの種類は有りません。変数名にはスネークケースを使用します。

続いて、2行目です。

n = n + 1

変数nに1を加えた値を、改めて変数nにセットします。
Rubyではn += 1と書けますが、Elixirではsyntax errorになります。

モジュールと関数

続いて、3行目です。

IO.puts n

IO.putsという名前の関数(function)に引数として
nを与えて呼び出しています。
この関数はRubyputsメソッド同様に
引数の内容を標準出力に書き直します。

IOはモジュール(module)の名前です。
モジュールと関数名は「.(ドット記号)」で結びます。

式の終端

IO.puts "Hello,world!";  IO.puts"What's up?"

式は行末で終了します。
上記のようにセミコロンで区切ることもできますが
使用頻度は多くありません。

コメント

# この行全体がコメント
n = 1
# n = n + 1 (コメント)
IO.puts n #モジュールと関数 (行末のコメント)

Rubyと同様にハッシュ記号(#)から
その行末までのコードがコメントとして適用されます。


【Laravel】値をチェックするためのメソッド

Laravelには引数の値が正しいか
チェックするメソッドがあります。

assertTrue(値)
assertFalse(値)

引数の真偽値をチェックします。


assertEquals(値1,値2)
assertNotEquals(値1,値2)

2つの値が等しいかどうかチェックします。

assertLessThan(値1,値2)
assertLessThanOrEqual(値1,値2)
assertGreaterThan(値1,値2)
assertGreaterThanOrEqual(値1,値2)

2つの値のどちらが大きいかチェックします。
LessThanは第一引数より第二引数の方が
小さい、または等しい場合。
GreaterThanは第一引数より第二引数の方が
大きい、または等しいことをチェックします。

assertStringsStartsWith(値1,値2)
assertStringsEndsWith(値1,値2)

引数の文字列が指定の文字列で
始まる、終わるかをチェックします。

【Laravel】セッション

セッションとは

クライアントとサーバーの接続維持のための
仕組みをセッションと呼びます。
例えるならAmazonで商品ページを移動しても
買い物カゴに情報が消えないように接続を維持することです。

セッション=クッキー+データベース

セッションではそれぞれのユーザーに
セッションID(=クッキー)を振り分けます。
そして、ユーザーごとの詳細情報を
そのセッションIDに関連付けて
データベースに保存します。

セッションを利用する

操作の基本は2つだけです。
-値に名前をつけて保存
-名前を指定して保存

値を保存する

 《Request》->session()->put( キー, 値 );


値を取得する

 $変数 = 《Request》session() -> put( キー );

【Laravel】withによるEagerローディング

データベースへのアクセス回数を軽減させるために(←N+1問題)
withメソッドを利用してデータを取得する方法があります。

withでデータを取得する

モデル :: with(リレーション名)->get();

このwithを使うとレコード取得方法が変わります。

1.モデルを取得
2.モデルのIDの値をまとめ、それらのIDのレコードを取得。

たった2回のデータベースアクセスですべてを取得できます。
このwithのような取得方法を
Eagerローディングと呼びます。

クラウドなどを利用してアプリを公開する場合、
データベースのアクセス数の増加はそのまま
料金に反映されるので少しでも減少できれば
コスト減に役立ちます。

【Laravel】グローバルスコープ

bootメソッドについて

処理の組み込みはモデルが作成される際の初期化処理として実行します。
これは__constructなど使用しません。
「boot」というモデルの初期化専用メソッドを用います。

bootメソッドの基本
protected static function boot()
{
    parent::boot;
   ・・・初期化処理・・・
}

これは静的メソッドです。
モデルインスタンス自身($this)を
利用する処理は書けません。
どうやってグローバルスコープの
処理を用意するかというと
「addGlobalScope」という静的メソッドを使うのです。

protected static function boot()
{
    parent::boot;
    
    static::addGlobalScope(スコープ名, function, (Builder $builder))
    {
       ・・・絞り込み処理・・・
    });
}

addGlobalScopeはその名の通り
グローバルスコープを追加するメソッドです。
これをオーバーライドすることで
グローバルスコープを追加できます。

このメソッドでは第1引数にスコープの名前を、
第2引数にクロージャを用意しています。
このクロージャはBuildeがインスタンス
引数として渡されます。

MVCのアーキテクチャ

MVCとは

一言でMVCといっても、人によって解釈が異なりますが
一般的にはUIと内部ロジックを分離するデザインパターンのことで

この3つの頭文字をとったものです。

 

MVCのメリット

MVCのメリットは機能が分離して、独立するから

  1. 分業によりそれぞれの専門家(Viewならデザイナーさんetc)が集中しやすい
  2. 一つの機能がほかの機能部分の変更による影響を受けにくいので保守性が高まる

ところ、とされています。

MVC実装の注意点

MVCモデルを実装するときの注意点として
ビジネスロジックはmodelに書いて!ファットコントローラはダメ!ゼッタイ!」
とよく言われます。

ファットコントローラというのは、色んな内部処理をコントローラに詰め込んでしまって
ソースコードが膨大かつ読みづらくなってしまうこと。

 

まとめ

MVCの仕組みや使われている経緯、意図を知ることで
そもそもの目的やあらかじめ気をつけておくべきこと、特に気にしなくてもよいことが明確になります。
更に使用するフレームワークが変わった時、使用言語が変わった時など
それぞれどこが違う(変えたいから変わった)のかがわかり理解しやすくなります。

【Laravel】モデルのスコープ

Laravelに搭載されてるデータベース操作機能で
DBクラス,クエリビルダよりも
扱いやすいのが*Eloquent**。
その中から「モデルのスコープ」について
まとめていきます。

モデルのスコープとは

スコープという言葉は一般的には
全体の中でどこからどこまでの範囲かを特定するものです。
今回のモデルのスコープというのは、
モデルの範囲を特定するものです。

検索条件が
・年齢が20歳以上
・性別が女性
・今月登録した人
だとすれば、
あらかじめモデルに「こういう条件のもと」といった
スコープを設定するメソッドを用意しておき
それを利用して細かな条件を設定した検索を
わかりやすく行えるようにできます。

このスコープには大きく分けて
「ローカルスコープ」と
「グローバルスコープ」があります。

ローカルスコープ

ローカルスコープは単純に
「検索条件を設定してBuilderを返すメソッド」を用意し
それを呼び出すというものです。
メソッドを呼び出して利用すればその機能が適用される。
whereを実行してBuilderを返すメソッドと同じです。

グローバルスコープ

モデル処理を用意すると
そのモデルのすべてのレコード取得にスコープが適用される。
グローバルメソッドとは違い
専用のbootメソッドを設定する。