こちらの記事は以下の書籍を参考にアウトプットとして執筆しました。
PHPフレームワーク Laravel入門 第2版
ORMとは
DBとPHPの橋渡しとなる。
DB操作をPHPらしく操作できる。
LaravelにはORMとしてEloquentがある
Eloquent
モデルと呼ばれるクラスを定義しこれを使っていく
モデルはテーブルの内容を定義したクラス
そのテーブルの中のフィールドをプロパティとして持っている
環境
mysqlのテーブルは以下の7つ
mysql> show tables;
+---------------+
| Tables_in_sns |
+---------------+
| articles |
| comments |
| members |
| messages |
| migrations |
| notifications |
| photos |
+---------------+
この7つのテーブルへ軽くORMで触れてみる
使っていく
モデル作成
例としてarticlesテーブルを操作するモデルArticleを作成する
$ php artisan make:model Article
appディレクトリ配下にモデルクラスが作成される
テーブルは複数形モデルは単数形という命名規則がある
そのためarticlesテーブルにはarticleという名前のモデルを作成した
モデルを利用するコントローラの作成
$ php artisan make:controller ArticleController
作成されたコントローラを編集する
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Article;
class ArticleController extends Controller
{
function index(Request $request)
{
$items = Article::all();
return view('article.index', ['items' => $items]);
}
}
上記の$items = Article::all();
で全レコードを取得している。
取得されたレコードはCollectionクラスのインスタンスとして得られる。
viewを書いて、
<body>
@foreach ($items as $item)
{{$item->id}}<br>
{{$item->created_at}}<br>
{{$item->content}}<br>
{{$item->article_id}}<br>
@endforeach
</body>
ルート情報を追加して
Route::get('article','ArticleController@index');
これでデータを取得できた
Collectionクラスをいじってみる
ここからはLaravel公式ドキュメントの内容
とりあえずメソッドを試してみる
そのまえにviewを修正する
<body>
@foreach ($items as $item)
{{$item->id}}<br>
{{$item->created_at}}<br>
{{$item->content}}<br>
{{$item->article_id}}<br>
@endforeach
<?php print_r($items)?>
</body>
上記の<?php print_r($items)?>
の部分を変えていく
all()
コレクション裏の配列を返すらしい
avg()
引数にカラム名を入れてその平均値を表示
$items->avg('id')
chunk()
指定子たサイズの小さなコレクションに分割
collapse()
1次元配列でないと使えない
コレクション裏の1次元配列同士をつなげて1つの配列にする
combline
コレクション値をキー、引数とし他配列を値とした新たな配列を生成
collect()
新たしいコレクションインスタンスを返す。
コピーに使えるのかな
concat()
使ってみた感じarray_push
と同じような感じ
$items->concat(['これは追加される'])->concat(['ここは追加されない'=>'これは追加される'])
// Illuminate\Database\Eloquent\Collection Object
// (
// [items:protected] => Array
// (
// [0] => App\Article Object()
// [1] => App\Article Object()
// [2] => これは追加される
// [3] => これは追加される
// )
// )
配列を連想配列にしても追加されるのは値の部分のみ。キーは追加されない。
contains()
指定したアイテムが含まれているかを判定
なぜかidカラムしか検索されない??
print_r($items->toArray());
// Array
// (
// [0] => Array
// (
// [id] => 10
// [created_at] => 1923-03-15T14:53:21.000000Z
// [content] => テストcontent
// [article_id] => 123
// )
// [1] => Array
// (
// [id] => 11
// [created_at] => 2020-09-08T00:00:00.000000Z
// [content] => 2つめ
// [article_id] => 987
// )
// [2] => Array
// (
// [id] => 141
// [created_at] => 1850-09-08T00:00:00.000000Z
// [content] => 3つめ
// [article_id] => 9287
// )
// )
//idカラムは判定される
$items->contains(10);//true
$items->contains(11);//true
$items->contains(141);//true
//それ以外は判定されない??
$items->contains(123);//false
$items->contains(987);//false
$items->contains(9287);//false
第2引数も指定することでペアの検索もできるようで