8
11

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】tinkerを使ってデータを操作する

Last updated at Posted at 2020-09-03

はじめに

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

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

▼今回の記事
↓Composerを使ってLaravelをインストールする
モデル・テーブルの作成+カラムの変更
  ・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'],

8
11
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
8
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?