【Laravel】ORMでテーブルからレコード取得

こちらの記事は以下の書籍を参考にアウトプットとして執筆しました。
[PHPフレームワーク Laravel入門 第2版](https://www.amazon.co.jp/dp/B08625YD7H/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

#ORMとは
DBとPHPの橋渡しとなる。
DB操作をPHPらしく操作できる。

LaravelにはORMとしてEloquentがある
##Eloquent
モデルと呼ばれるクラスを定義しこれを使っていく

モデルはテーブルの内容を定義したクラス
そのテーブルの中のフィールドをプロパティとして持っている

#環境
mysqlのテーブルは以下の7つ

```sql
mysql> show tables;
```
```:出力
+---------------+
| Tables_in_sns |
+---------------+
| articles      |
| comments      |
| members       |
| messages      |
| migrations    |
| notifications |
| photos        |
+---------------+
```

この7つのテーブルへ軽くORMで触れてみる

#使っていく
##モデル作成
例として**articles**テーブルを操作するモデル**Article**を作成する

```bash 
$ php artisan make:model Article
```
appディレクトリ配下にモデルクラスが作成される

###テーブルは複数形モデルは単数形という命名規則がある


そのためarticlesテーブルにはarticleという名前のモデルを作成した

##モデルを利用するコントローラの作成
```bash
$ php artisan make:controller ArticleController
```
作成されたコントローラを編集する

```php5:ArticleController.php
<?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を書いて、

```php5:index.blade.php
<body>
    @foreach ($items as $item)
      {{$item->id}}<br>
      {{$item->created_at}}<br>  
      {{$item->content}}<br>  
      {{$item->article_id}}<br>  
    @endforeach
    
</body>
```
ルート情報を追加して

```php5:web.php
Route::get('article','ArticleController@index');
```

これでデータを取得できた

#Collectionクラスをいじってみる
ここからは[Laravel公式ドキュメント](https://readouble.com/laravel/7.x/ja/collections.html)の内容
とりあえずメソッドを試してみる

そのまえにviewを修正する

```php5:index.blade.php
<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()
引数にカラム名を入れてその平均値を表示

```php5:例
$items->avg('id')
```
##chunk()
指定子たサイズの小さなコレクションに分割
##collapse()
1次元配列でないと使えない
コレクション裏の1次元配列同士をつなげて1つの配列にする
##combline
コレクション値をキー、引数とし他配列を値とした新たな配列を生成
##collect()
新たしいコレクションインスタンスを返す。
コピーに使えるのかな
##concat()
使ってみた感じ`array_push`と同じような感じ

```php5:例
$items->concat(['これは追加される'])->concat(['ここは追加されない'=>'これは追加される'])
// Illuminate\Database\Eloquent\Collection Object
// (
//     [items:protected] => Array
//         (
//             [0] => App\Article Object()
//             [1] => App\Article Object()
//             [2] => これは追加される
//             [3] => これは追加される
//         )
// )
```
配列を連想配列にしても追加されるのは値の部分のみ。キーは追加されない。
##contains()
指定したアイテムが含まれているかを判定
なぜかidカラムしか検索されない??

```php5
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引数も指定することでペアの検索もできるようで