0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

こちらの記事は以下の書籍を参考にアウトプットとして執筆しました。
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

作成されたコントローラを編集する

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を書いて、

index.blade.php
<body>
    @foreach ($items as $item)
      {{$item->id}}<br>
      {{$item->created_at}}<br>  
      {{$item->content}}<br>  
      {{$item->article_id}}<br>  
    @endforeach
    
</body>

ルート情報を追加して

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

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

Collectionクラスをいじってみる

ここからはLaravel公式ドキュメントの内容
とりあえずメソッドを試してみる

そのまえにviewを修正する

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()

引数にカラム名を入れてその平均値を表示

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

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?