【Laravel】tinkerを使ってデータを操作する

# はじめに
初心者がLaravelでwebサービスを開発する中でのそれぞれの段階での備忘をまとめていきます。初心者のため修正・指摘・アドバイスなどありましたらご教授いただけるととても嬉しいですm(__)m。

**▼作っているもの**
レシピ投稿サイトのようなもの。DBにはrecipesというテーブルを作り、レシピを投稿していくのを想定。

**▼今回の記事**
↓Composerを使ってLaravelをインストールする
↓[モデル・テーブルの作成＋カラムの変更](https://qiita.com/mam-e/items/699d4c5433d0dedce138)
　　・[MySQL5.6から5.7にアップグレード]()
　　・[composerでdoctrine/dbalを導入する]()
↓**tinkerを使ってサンプルデータを入れる**　👈ｺｺ
↓・・・

**▼開発環境**
・CentOS 6.10(virtualboxとvagrantでローカル開発環境)
・MacBook (macOS Catalina バージョン10.15.2)
・PHP 7.1.33
・Laravel Framework 5.8.38
・MySQL バージョン5.7.31

**▼前提**
・ローカル開発環境構築済み。
・MySQL,Laravelをインストール済み。
・データベース、モデル、テーブル作成済み。


# 基本・操作対象
**▼Laravelでのデータ操作**
・LaravelのモデルはEloquentモデルと呼ばれていて、直感的な操作が可能
・```php artisan tinker```というコマンドを最初に使う

**▼今回操作するモデル・テーブルの詳細**
⬜︎モデル：Recipe
⬜︎テーブル：recipes　※投稿されたおもちゃのレシピを保存する
⬜︎カラム：タイトル(title)、簡単な説明(body)、完成イメージ画像(img)、投稿した人(user_id)、投稿/編集された日時(created/updated_at)

```
mysql> desc recipes; //テーブルの構造を確認
+------------+---------------------+------+-----+---------+----------------+
| Field      | Type                | Null | Key | Default | Extra          |
+------------+---------------------+------+-----+---------+----------------+
| id         | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| title      | varchar(255)        | NO   |     | NULL    |                |
| body       | text                | NO   |     | NULL    |                |
| img        | varchar(255)        | NO   |     | NULL    |                |
| user_id    | int(10) unsigned    | NO   |     | 0       |                |
| created_at | timestamp           | YES  |     | NULL    |                |
| updated_at | timestamp           | YES  |     | NULL    |                |
+------------+---------------------+------+-----+---------+----------------+
```

# ■レコードの挿入
```php artisan tinker```で操作できるようにしたあと、

### 方法①インスタンスを作ってsaveメソッドで保存する

```
$post = new App\Recipe();

$post->title = 'マラカス';
$post->body = '乳児さんから楽しめるおもちゃ♪';
$post->img = '1.png';
・・・
$post->save();
```
### 方法②インスタンスを作らず一気に追加する

```
App\Recipe::create(['title'=>'マラカス, 'body'=>'乳児さんから楽しめるおもちゃ♪', …　]);
```
※MassAssignmentエラーが出ないようにモデルの設定を変える必要あり※
✔️Laravelでは、デフォルトで意図しないリクエストによって悪意のあるデータが挿入されてしまう脆弱性(MassAssignment)の対策が有効になっているため、何もしないままレコードを挿入しようとするとエラーが出る。
✔️appフォルダの中のモデルに関するファイル(この例ではRecipe.php)を開き、レコードを挿入しても良いカラム名を下記のように書く。

```Recipe.php
class Recipe extends Model
{
    // title,body,imgのカラムは、レコードの挿入を許可
    // 設定を変えたあとは一旦tinkerからexitする
    protected $fillable = ['title', 'body', 'img'];
}
```

# ■データ抽出
### 全てのデータを抽出：```all()```
```
App\Recipe::all();
```
✔️配列で返したい場合は、```App\Recipe::all()->toArray();```

### idを指定して抽出：```find()```
```
// （例）id=2のレコードを抽出
App\Recipe::find(2)->toArray();
```

### 条件を指定して抽出：```where()->get()```
```
// （例）id>1のレコードを抽出
App\Recipe::where('id', '>', 1)->get()->toArray();
```
**✔️```where('カラム名','オペレーター','カラムに対して比較する値')```**
※詳細は ■発展 に書く予定

### 出力順を変える：```orderBy()```
```
// （例）id>1のレコードを、生成された日時の降順で出力
App\Recipe::where('id', '>', 1)->orderBy('created_at', 'desc')->get()->toArray();
```

### 取得するレコード数の件数を設定：```take()```
```
// （例）id>1のレコードを、1件のみ出力(id=2のデータ)
App\Recipe::where('id', '>', 1)->take(1)->get()->toArray();
```

# ■データの更新
✔️1件レコードを抽出し変数に代入したあと、カラムを変更後、saveメソッドで保存

```
$post = App\Recipe::find(1);

$post->title = 'ベビーマラカス'; //タイトルを変更
・・・
$post->save();
```

# ■データの削除
✔️1件レコードを抽出し変数に代入したあと、削除

```
$post = App\Recipe::find(1);

$post->delete();
```

#　最後に
今後追加していく予定です（~~きっと~~）

# ■応用
## データ抽出（条件）：```where()->get()```
▼オペレーター：'>'
（例）titleに「ベビー」を含むレコードを抽出
```App\Recipe::where('title','like','%''ベビー''%')->get();```
（例）titleに「ベビー」を含むレコードを抽出
```App\Recipe::where('title','like','%'.'ベビー'.'%')->get();```

['title'=>'ベビーマラカス他','body'=>'赤ちゃんから楽しめる超簡単おもちゃ♪','img'=>'1.png','age'=>'0,1,2,3','material'=>'1,5','level'=>'A'],