SEブログ

【Laravel】tinkerを使いMySQLのテーブルを操作する

この記事は、Laravel 入門者向けの ひとこと掲示板シリーズの記事になります。

【Laravel】入門者向けとしてのまとめ

 

 

前回は、DB とテーブルを作り、tinker を使ってカラム毎にデータを入れる事をやってみました。

(下のリンクが前回のその記事になります。)

今回も tinker を使いますが、tinker でデータを操作する方法について簡単にまとめてみました。

この操作が理解できると、データの追加や参照などがより効率的にできるようになります。

 

 

【PHP】LaravelのDBとテーブルを作成する

 

 

 

スポンサーリンク

環境

 

 

以下の環境を使っています。

 

  • Cloud 9
  • PHP 7.0
  • Laravel 5.5.40
  • MySQL 5.5

 

テーブル構造ですが、前回の続きなので以下のデータが入っています。

 

 

 

 

スポンサーリンク

手順

 

 

tinker を使えるようにする

 

 

user:~/workspace/bbs $ php artisan tinker
Psy Shell v0.9.6 (PHP 7.0.30-1+ubuntu14.04.1+deb.sury.org+1 — cli) by Justin Hileman

 

 

ちなみに artisan って日本語で何の意味か知っていますか?

「職人」という意味です。craftsman と同じ意味なんでしょうかね。

また、tinker とは、「下手な修理をする」という意味なんですが、他にも「いじくり回す」という意味もあります。

 

 

 

 

ですので laravel 入門者の私としては、php artisan tinker というコマンドを以下のように覚えてます。(笑)

なかなか面白いですね。

 

 

php artisan tinker は

「php が職人を召喚していじくり回す」

と覚えましょう!

 

 

 

ID を指定してデータを抽出する

 

 

DB に入っているデータを抽出したい場合は、以下のコマンドを使います。

説明としては、App\Post::find で () の中は ID 番号を指定します。をれを配列に変換したいので ->toArray() を使います。

ここでは、ID が 2 番目のデータを抽出しています。

 

>>> App\Post::find(2)->toArray(); 
=> [
    "id" => 2,
    "title" => "Title2",
    "body" => "Body1",
    "created_at" => "2018-06-13 23:34:50",
    "updated_at" => "2018-06-13 23:38:06",
]

 

 

ちなみに、実行結果が以下のようなメッセージが返ってきたら、MySQL のサービスが開始されていない可能性が高いかと思われます。

 

Illuminate/Database/QueryException with message 'SQLSTATE[HY000] [2002] Connection refused (SQL: select * from `posts` where `posts`.`id` = 2 limit 1)'

 

 

その場合は MySQL のサービスを起動しましょう。

 

user:~/workspace/bbs $ mysql-ctl start
* Starting MySQL database server mysqld
...done.
* Checking for tables which need an upgrade, are corrupt or were 
not closed cleanly.

 

 

ここでもう一度、職人さん呼んでいじくり回します。今度はデータの抽出ができました。

私はここで結構ハマっていたので、必ず書かねばと思い書きました!

Cloud 9 を使う場合、私はサーバー側のほうをあまり気にしていないので、「MySQL がいつも動いているんじゃないか」と勘違いしてしまうんです。

ですので、こういった問題が発生するとかなり焦りますね。(汗)

 

user:~/workspace/bbs $ php artisan tinker
Psy Shell v0.9.6 (PHP 7.0.30-1+ubuntu14.04.1+deb.sury.org+1 — cli) by Justin Hileman
>>> App\Post::find(2)->toArray();
=> [
    "id" => 2,
    "title" => "Title2",
    "body" => "Body1",
    "created_at" => "2018-06-13 23:34:50",
    "updated_at" => "2018-06-13 23:38:06",
   ]
>>> 

 

 

 

特定の ID より大きいデータを抽出する

 

 

さて、簡単にデータを抽出する事ができるようになりましたので、今度は部分的にデータを取ってみます。

方法は色々あるかもしれませんが、私が覚えたのは where メソッドなので、これを使います。

説明としては、where メソッドで id が 1 より大きい条件に当てはまったデータを、get メソッドで取得して、最後に配列に変換します。

 

>>> App\Post::where('id', '>', 1)->get()->toArray();
=> [
    [
    "id" => 2,
    "title" => "Title2",
    "body" => "Body1",
    "created_at" => "2018-06-13 23:34:50",
    "updated_at" => "2018-06-13 23:38:06",
    ],
   ]

 

 

複数のカラムにデータを追加する(一気に追加したい)

 

 

前回は、カラム毎にデータを追加しましたが、さすがに面倒なので、レコード単位で一気に追加したいと思います。

レコードの追加方法としては、2 種類あります。

おさらいですが、これは前回の方法で、モデルのプロパティに値を代入してから、save メソッドを実行するパターンです。

 

$post->title = 'title1'; 
$post->body = 'body1';
$post->save();

 

 

今回は、createメソッドに連想配列を渡すことをレコードを追加します。

 

App\Post::create([
'title' => 'title3',
'body' => 'body3'
]);

 

 

それでは早速実行してみると、あれ?何かわからないメッセージが出てきました。

 

>>> App\Post::create(['title'=>'Title3', 'body'=>'Body3']); 
Illuminate/Database/Eloquent/MassAssignmentException with message 'title' 

 

 

これは MassAssigmentException というセキュリティーの攻撃を受けない設定を、Laravel ではデフォルトで設定してある為になります。

(悪意のあるユーザーが、本来設定できないカラムの値を設定する攻撃になります。)

 

 

例えば、users テーブルに role というカラムがあったとします。

そこで、 <input type=”hidden” name=”role” value=”admin”> という入力値をそのまま使って、ユーザーを作成した場合に role に admin が書き込まれてしまうとまずいですよね。

書き込まれずに無視するには、MassAssigmentException 対策が必要になります。

この MassAssignment 対策に対して、モデルにあるファイルに以下の画像のように書いてあげる必要があります。

 

class Post extends Model
{
    protected $fillable = ['title', 'body']; 
}

 

 

 

 

MassAssignment 対策で忘れそうになりましたが、データの追加をもう一度試してみましょう。

今回は、問題なくデータの追加ができました。

 

>>> App\Post::create(['title' => 'title3','body' => 'body3']);
=> App\Post {#2839
title: "title3",
body: "body3",
updated_at: "2018-06-14 21:15:02",
created_at: "2018-06-14 21:15:02",
id: 3,
}
$post->save();

 

 

ついでにもう一つデータを追加します。

 

>>> App\Post::create(['title' => 'title4','body' => 'body4']);
=> App\Post {#2839
    title: "title4",
    body: "body4",
    updated_at: "2018-06-14 23:34:50",
    created_at: "2018-06-14 23:34:50",
    id: 4,
}
$post->save();

 

 

 

抽出したデータを並びかえる

 

 

抽出したテーブルの特定のカラムを orderby 句で並び替えます。

orderby 句で取れたデータを、get メソッドで取得して、最後に配列に変換します。

 

>>> App\Post::where('id', '>', 1)->orderby('created_at', 'desc')->get()->toArray();
=> [
    [
    "id" => 4,
    "title" => "title4",
    "body" => "body4",
    "created_at" => "2018-06-14 23:34:50",
    "updated_at" => "2018-06-14 23:34:50",
    ],
    [
    "id" => 3,
    "title" => "title3",
    "body" => "body3",
    "created_at" => "2018-06-14 21:15:02",
    "updated_at" => "2018-06-14 21:15:02",
    ],
    [
    "id" => 2,
    "title" => "Title2",
    "body" => "Body1",
    "created_at" => "2018-06-13 23:34:50",
    "updated_at" => "2018-06-13 23:38:06",
    ],
   ]

 

 

 

抽出したデータから件数を指定する

 

 

抽出したテーブルの特定のカラムを take メソッドで 指定した件数を表示します。

where メソッドで取れた id が 1 より大きいデータを、take メソッドで 1件取得して、最後に配列に変換します。

 

>>> App\Post::where('id', '>', 1)->take(1)->get()->toArray();
=> [
    [
    "id" => 2,
    "title" => "Title2",
    "body" => "Body1",
    "created_at" => "2018-06-13 23:34:50",
    "updated_at" => "2018-06-13 23:38:06",
    ],
   ]

 

 

以上になります。いかがでしょうか。

私はデータの操作って SQL で直接書くものだとまだ頭の中にありますが、こうやってデータの操作が非常に短い文で書けると便利ですね。

早くなれるようにしたいです。

 

 

 

では最後までお読みいただきありがとうございました!

 

 

以下の記事をクリックして次に進みましょう!

 

【Laravel】DBの内容をブラウザに表示する方法

 

 

おすすめの本はこちら ↓↓↓