20200530のlaravelに関する記事は6件です。

Laravelでメールを送るときに$messageという変数を使ったら「htmlspecialchars() expects parameter 1 to be string, object given」というエラーが出る

もはやタイトルの通りなのですが、何度も引っかかるので備忘録としてメモっておきます。

環境

  • Laravel6系※5系を利用していたときも同じエラーを踏んだ記憶があります

挙動1:Mailableを継承したクラスでprivateなメンバ変数$messageを持っていると表題のエラーが出る

    private $message;

    public function __construct(UserDto $userDTO, string $message)
    {
        $this->userDTO = $userDTO;
        $this->message = $message;
    }

    ...中略...

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->subject('タイトル')
            ->to($this->userDTO)
            ->view('emails.sample.notified')
            ->with(['user_name' => $this->userDTO->name, 'message' => $this->message]);
    }

まあ、上記のようなメール送信を行うクラスがあったとしましょう。これを利用してメール送信を実行すると

local.ERROR: htmlspecialchars() expects parameter 1 to be string, object given (View: /app/packages/resources/views/emails/sample/notified.blade.php) {"userId":XXXX,"exception":"[object] (ErrorException(code: 0): htmlspecialchars() expects parameter 1 to be string, object given (View: /app/packages/resources/views/emails/sample/notified.blade.php) at /app/packages/vendor/laravel/framework/src/Illuminate/Support/helpers.php:251)
[stacktrace]

というエラーが出ます。

挙動2:$messageをpublicに変えると、何もエラーが出ないがメールも送られなくなる

こちらももっと謎なのですが、

    public $message

のように修飾子を変更すると、エラーも出なくなりますがメールも送られなくなります。いよいよ謎です。

対策

withの変数名を変えると動きます。例えばbodyなどに変更します。クラスのmessageプロパティの命名や修飾子は変えなくていいです。

            ->with(['user_name' => $this->userDTO->name, 'body' => $this->message]);

原因はわからない

追記

コメントの方でこれが原因では、という推測をいただきましたので、原因が気になる方はコメントをご参照ください。
※コメントに至った会話の流れが見えなくなるので、下記記述は一旦消さないでおきます。


軽く追ってみたのですがさっぱりわかりません。ただ、Mailableクラスのここはちょっと怪しいなと感じました。

Mailable.phpL297
        foreach ((new ReflectionClass($this))->getProperties(ReflectionProperty::IS_PUBLIC) as $property) {
            if ($property->getDeclaringClass()->getName() !== self::class) {
                $data[$property->getName()] = $property->getValue($this);
            }
        }

ReflectionClassを使って自クラスのpublicなプロパティを一覧で取得しており、それを$dataに入れているので、ここで'message'という名前がカニバってしまっており、もともと期待されていた挙動をしなくなったのではないかと類推しました(そこから、挙動2のように修飾子を変える実験に至った)。が、もうちょっと追わないとわからないです。

あと、2020年5月現在のLaravel最新ソースが、僕の手元のソースから若干変更が入っており、現在は治っている可能性は一応あります。

https://github.com/laravel/framework/blob/7.x/src/Illuminate/Mail/Mailable.php

所感

この挙動に基づいたIssueとか見当たらなかったのですが、自社のなんらかの他のソースが影響しているのかなぁ・・・Mailableはそのまま使っているのでありえないとは思うのですが。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelでホストOSのフォルダーがvagrantから見られない時

この前久々にLaravel触って、なんだかうまく動かないからぐぐってみたら、自分がQiitaに投稿した記事が最初に出てきた。
知ってたんじゃん、俺。
成長していないな、俺。
そんな未来の俺のために、今日も嵌ったことを書いておく。

vagrantからLaravelのプロジェクトが参照できない!?

Laravelのプロジェクト作って、vagrantでhomesteadの環境作って、なんだかい感じにできていたはずなのに、vagrantにsshでターミナルつないでlsとかしてみると、何故か作ったはずのLaravelプロジェクトが参照できない。
ホストOS上は確かに存在しているのに、つながっていない。
なんだ、VirtualBoxの設定か?と思って設定を見てみても、特に怪しいところはない。何しろその辺いじってないし。

そんな時はお客さん、どうやってvagrant立ち上げたか、じっくり思い出してみな。
VirtualBoxから直接仮想サーバー立ち上げたりしてない?

vagrant upのコマンドの中でいろいろ設定しているので、VirtualBoxから直接仮想サーバー立ち上げると、ホストOSとvagrantのフォルダがつながらないんだよ。

homesteadをインストールしたフォルダーから、vagrant upしたらつながると思うよ、きっと。

Virtual Boxを直接いじることが多いとついVirtualBoxから立ち上げてしまうが、基本に忠実に行動しましょう、というお話でした。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

チャットアプリで、1グループのメッセージ数上限を50件にする(Laravel)

はじめに

初心者による初心者向けの記事です。
陥りやすい様々な苦手分野も交えて書いてみました。
「collectionと配列の違い」「モデルインスタンスってなんやねん!」「クエリビルダとかメソッドとかわからん!」「ネットでcount()関数について調べてから使ったのに、エラーになる!」など。

このように実装しようと思った背景

実用的なチャットアプリを作りたいため、今回の実装をしました。
テーブル関係はgroups hasmany messagesの1対多です。
私はAjax通信のリアルタイムチャットアプリを作成しています。LINEのグループチャット的なものです。
トークルームのAjaxは、では5秒おき(setTimeout("get_messageC()",5000);)にそのグループの全メッセージを取得し、表示してあるメッセージを全部消して(.remove();)全部書き足す(.append(html);)という実装をしています。
しかしこれでは、メッセージが1000,2000と増えるごとに動作が重くなってしまいます。よって、1グループメッセージは50件までしか保存されないような設計にしました。そうすれば最大でも50件しか書き換えと表示が行われません。

やること

★メッセージ送信アクション時に、そのgroup_idと関連づいたmessageの数を数える(ここでcollectionと配列の違いを理解しとく必要がある)→
★50件以上あるなら、上位50件以外のメッセージは削除する(ここでモデルインスタンスなのかDBインスタンスなのか把握しておく必要がある)

下図messageテーブルです。ターミナルにてmysqlで出しました。見づらいですが、messagesテーブルのカラムにgroup_idがあります。user_idはグループ作成者です。いざという時の拡張性を考えて入れときました。
スクリーンショット 2020-05-30 11.50.52.png

collectionと配列の違い

collectionはLaravelが提供する高機能な配列です。一方で配列はみなさんがよく見かけるphpの「the・普通の配列」です。
データをインスタンス化した時はcollectionであることが多いです。例えば下記のようにモデルをインスタンス化した時。
例:$apple = new Apple;
下記のように自分で配列を作った時は、紛れもなくphpの配列です。
例:$apple = array('iphone','macbook' ,'ipad');

違いを理解すべき瞬間

厄介なのは、「配列の要素数を数えるcount関数」1つとっても、collectionと配列で文法が異なることです。先ほどの$appleを例に取りましょう。
collectionの場合$count = $apple->count();
配列の場合$count = count($apple);
ちなみに配列関数count()をcollectionに適用すると以下のようなエラーが出ます。
ErrorException (E_WARNING)
count(): Parameter must be an array or an object that implements Countable

「count()関数は引数は配列かオブジェクトじゃないとダメですよ〜」ということですね。collectionを配列とみなしていないようです。
ちなみに僕もなんのインスタンスがcollectionになるのか、というのは把握していません。エラー文見てその都度判断してます。

書いたコード

先にクラスをuseしちゃいましょう。自分のコントローラーにあるものをコピペします。

今回使用するクラス

注目すべき箇所は「★」をつけてます。今回は★をuseしておけば問題ないと思います。

GroupController.php
<?php

namespace App\Http\Controllers\User;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB; //★
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Auth;
use Illuminate\Support\Facades\Hash;
use App\User;
use App\Follow;
use Abraham\TwitterOAuth\TwitterOAuth;
use App\Group;
use App\Message; //★
use Illuminate\Support\Facades\Log;
use Storage; 
GroupController.php@send
///まず現在チャットしているgroupのメッセージ数を全て取得します。
    $count = $message->where('group_id',$_POST['group_id'])->count();
///その数が50を超えているなら、
    if ($count > 50) {
///現在チャットしてるグループがhasするmessageのidを取得するためにやはりまずメッセージを取得します
      $deleteid = DB::table('messages')
      ->where('group_id', $_POST['group_id'])
///それの並び順を古い順から新しい順に変えます。
      ->orderBy('id','desc')
///messageデータを50件のみ取得します(新しい順なので最新50件)。
      ->take(50)
///idのみ抽出します(必要ないけど、動作軽くなるかなーと思って)
      ->pluck('id')
//最新50件のなかで最も古いメッセージのidを取得。これで$deleteidに最も古いメッセージのidを入れました。
      ->min();

      Message::where('group_id',$_POST['group_id'])
//$deleteidより古いメッセージは全て削除。
      ->where('id','<',$deleteid)->delete();
    }

このコードより前で$message = new Message;しました。つまり$messageは、Messageモデルのインスタンスです。group_idはAjaxのtype: "POST",で送信しているので、$_POST['group_id']で受け取ります。type: "GET",の場合やそもそもtype指定してない場合は$_GET['group_id']で受け取ってください。type指定しないと自動でtype: "GET",になるので。

tips

なぜ$messageがあるにもかかわらずif(){}内でわざわざDB::table('messages');しているのか。なぜ$messageを使用しないのか。
それは、$messageはcollectionだからです。Messageモデルのインスタンスなのでcollectionになります。
クエリビルダのメソッドを使いたいです。->orderBy()->take()->pluck()を使いたいです。DBのインスタンスじゃないとクエリビルダメソッドは使えません。
ちなみにuse Illuminate\Support\Facades\DB; //★クラスをインスタンス化してます。

また、$messageにクエリメソッドをしようすると、Object of class Illuminate\Database\Eloquent\Builder could not be converted to stringエラーが出ます。
一番下でまたクラス呼んでいますが、なぜそうしたか自分でもわかりません。昨日の自分に問い質したいです。
Message::where('group_id',$_POST['group_id'])
->where('id','<',$deleteid)->delete();

最後に

よく「ドキュメント読め」とか「オブジェクト指向を理解しろ」と言われますが、それが全てだと僕は思いません。
ドキュメントが理解できるようになったのは学習開始5ヶ月目とかですし、平均1日6時間とか勉強した挙句のそれです。
僕が要領悪いだけかもしれませんが、是非僕のような初心者の方の役に立てたら幸いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

朝飯前にMacのローカルにLaravel環境を構築する

Mac ローカルにPHPをインストールする

サクッとLaravel環境を作りたい時ってありますよね?
カップ麺を作る時間すらも惜しい...そんな時...

MacのローカルにLaravel環境を構築する手順をご紹介します。

Mac標準のPHP

$ which php
/usr/bin/php

$ php -v
PHP 7.3.11 (cli) (built: Feb 29 2020 02:50:36) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.11, Copyright (c) 1998-2018 Zend Technologies

これでもいいんですけど、バージョンが古かったりzip拡張機能がデフォルトで入ってなかったりするので少し面倒なので、HomebrewでPHPをインストールします。

複数のPHPバージョンを使い分けたい訳ではなく最新版のPHPが使えればいいので、今回はanyenvやphpenvは使いません。

Homebrew からPHPをインストールする

$ brew install php

~/.zshrc に環境変数のPATHにPHPのパスを追加します。

$ echo export PATH='/usr/local/opt/php/bin/php:$PATH' >> ~/.zshrc

シェルを再起動して設定ファイルを読み直します。

$ exec $SHELL -l

PHPのバージョンが更新されたらokです。

$ php -v
PHP 7.4.6 (cli) (built: May 29 2020 01:44:57) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.6, Copyright (c), by Zend Technologies

HomebrewからインストールしたPHPに入っているPHP拡張機能です。

$ php -m
[PHP Modules]
bcmath
bz2
calendar
Core
ctype
curl
date
dba
dom
exif
FFI
fileinfo
filter
ftp
gd
gettext
gmp
hash
iconv
intl
json
ldap
libxml
mbstring
mysqli
mysqlnd
odbc
openssl
pcntl
pcre
PDO
pdo_dblib
pdo_mysql
PDO_ODBC
pdo_pgsql
pdo_sqlite
pgsql
Phar
phpdbg_webhelper
posix
pspell
readline
Reflection
session
shmop
SimpleXML
soap
sockets
sodium
SPL
sqlite3
standard
sysvmsg
sysvsem
sysvshm
tidy
tokenizer
xml
xmlreader
xmlrpc
xmlwriter
xsl
Zend OPcache
zip
zlib

[Zend Modules]
Zend OPcache

これだけ入っていれば十分でしょう。

Homebrew からComposerをインストールする

$ brew install composer
$ composer -V
Composer version 1.10.6 2020-05-06 10:28:10

SQLite

データベースは何でもいいですが、今回は導入が手軽なSQLiteにします。

$ brew install sqlite
$ sqlite3 --version
3.28.0 2019-04-15 14:49:49 378230ae7f4b721c8b8d83c8ceb891449685cd23b1702a57841f1be40b5daapl

Laravelインストーラ

Laravelのバージョンの指定は必要なく最新版をインストールして使いたいのでLaravelインストーラを入れておくと便利でしょう。

$ composer global require laravel/installer

グローバルにlaravel/installer が追加されていたらokです。

$ composer global show | grep laravel
Changed current directory to /Users/ucan/.composer
laravel/installer         v3.1.0  Laravel application installer.

~/.zshrc に環境変数のPATHにPHPのパスを追加します。

$ echo export PATH='$HOME/.composer/vendor/bin:$PATH' >> ~/.zshrc

シェルを再起動して設定ファイルを読み直します。

$ exec $SHELL -l

Laravelのインスール

上記の作業は寝る前に事前に済ませておきましょう。
Laravelのインストールはもはや朝飯前です。

$ laravel new blog
$ cd blog
$ php artisan --version
Laravel Framework 7.13.0

Laravelビルトインサーバを起動する

$ php artisan serve

http://127.0.0.1:8000

control + c でサーバーを停止できます。

LaravelとSQLiteを接続する

.env を修正する

DB_CONNECTION=sqlite
#DB_CONNECTION=mysql
#DB_HOST=127.0.0.1
#DB_PORT=3306
#DB_DATABASE=laravel
#DB_USERNAME=root
#DB_PASSWORD=

データベースファイルを作成する

$ touch database/database.sqlite
$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0 seconds)

最後に

Laravelの環境構築の記事をいくつか書いているのでよかったら読んでもらえたら嬉しいです!
(情報が古くなってるものもありますが...)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel Authで実装した認証機能の初回登録時にオリジナルカラムデータの保存に対応する。

目的

  • ユーザの初回登録時にデフォルトでは存在していないカラムへ自動的に値を格納する方法をまとめる

実施環境

  • ハードウェア環境
項目 情報
OS macOS Catalina(10.15.3)
ハードウェア MacBook Pro (16-inch ,2019)
プロセッサ 2.6 GHz 6コアIntel Core i7
メモリ 16 GB 2667 MHz DDR4
グラフィックス AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB
  • ソフトウェア環境
項目 情報 備考
PHP バージョン 7.4.3 Homwbrewを用いて導入
Laravel バージョン 7.0.8 commposerを用いて導入
MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いて導入

前提情報

実施したい事

  • Authの認証に使用されるusersテーブルは初期状態で下記のカラムで構成されている。

    mysql> show columns from users;
    +-------------------+-----------------+------+-----+---------+----------------+
    | Field             | Type            | Null | Key | Default | Extra          |
    +-------------------+-----------------+------+-----+---------+----------------+
    | id                | bigint unsigned | NO   | PRI | NULL    | auto_increment |
    | name              | varchar(255)    | NO   |     | NULL    |                |
    | email             | varchar(255)    | NO   | UNI | NULL    |                |
    | email_verified_at | timestamp       | YES  |     | NULL    |                |
    | password          | varchar(255)    | NO   |     | NULL    |                |
    | remember_token    | varchar(100)    | YES  |     | NULL    |                |
    | created_at        | timestamp       | YES  |     | NULL    |                |
    | updated_at        | timestamp       | YES  |     | NULL    |                |
    +-------------------+-----------------+------+-----+---------+----------------+
    
  • この情報にプラスしてサービスを使用するユーザが結婚しているかどうかのデータを格納する「marriage_flag」カラムを追加する。

  • 「marriage_flag」カラムは次の条件で作成する。(カラム名: marriage_flag データ型: int NULLの許容: しない 初期値:0)

    +-------------------+-----------------+------+-----+---------+----------------+
    | Field             | Type            | Null | Key | Default | Extra          |
    +-------------------+-----------------+------+-----+---------+----------------+
    | marriage_flag     | int             | NO   |     | 0       |                |
    +-------------------+-----------------+------+-----+---------+----------------+
    
  • カラム設定でも初期値を指定するが、ユーザ登録シーケンス内でもアプリ側で値を格納するように処理を行う。

  • 「marriage_flag」は0が格納されている時は未婚、1が格納されている時は既婚、2が格納されている時はその他をお見する。

概要

  1. カラムの追加
  2. 登録処理の値追加
  3. 確認

概要

  1. カラムの追加

    1. 下記コマンドを実行してマイグレーションファイルを作成する。

      $ php artisan make:migration add_marriage_flag_column_to_users_table --table=users
      
    2. 下記コマンドを実行して先に作成したマイグレーションファイルを開く(yyyy_mm_ddはマイグレーションファイルの作成日)

      $ vi database/migrations/yyyy_mm_dd_XXXXXX_add_marriage_flag_column_to_users_table.php
      
    3. 開いたマイグレーションファイルを下記の様に修正しする。

      アプリ名ディレクトリ/database/migrations/yyyy_mm_dd_XXXXXX_add_marriage_flag_column_to_users_table.php
      <?php
      
      use Illuminate\Database\Migrations\Migration;
      use Illuminate\Database\Schema\Blueprint;
      use Illuminate\Support\Facades\Schema;
      
      class AddMarriageFlagColumnToUsersTable extends Migration
      {
          /**
           * Run the migrations.
           *
           * @return void
           */
          public function up()
          {
              Schema::table('users', function (Blueprint $table) {
                  //下記を追記する
                  $table->integer('marriage_flag')->default(0);
              });
          }
      
          /**
           * Reverse the migrations.
           *
           * @return void
           */
          public function down()
          {
              Schema::table('users', function (Blueprint $table) {
                  //下記を追記する
                  $table->dropColumn('marriage_flag')->default(0);
              });
          }
      }
      
    4. 下記を実行してマイグレーションを実行する。

      $ php artisan migrate
      
  2. 登録処理の値追加

    1. 下記コマンドを実行してユーザ登録時に実行されるコントローラファイルを開く。

      $ vi app/Http/Controllers/Auth/RegisterController.php
      
    2. 開いたコントローラファイルを下記の様に修正して初期値を指定する。

      アプリ名ディレクトリ/app/Http/Controllers/Auth/RegisterController.php
      <?php
      
      namespace App\Http\Controllers\Auth;
      
      use App\Http\Controllers\Controller;
      use App\Providers\RouteServiceProvider;
      use App\User;
      use Illuminate\Foundation\Auth\RegistersUsers;
      use Illuminate\Support\Facades\Hash;
      use Illuminate\Support\Facades\Validator;
      
      class RegisterController extends Controller
      {
          /*
          |--------------------------------------------------------------------------
          | Register Controller
          |--------------------------------------------------------------------------
          |
          | This controller handles the registration of new users as well as their
          | validation and creation. By default this controller uses a trait to
          | provide this functionality without requiring any additional code.
          |
          */
      
          use RegistersUsers;
      
          /**
           * Where to redirect users after registration.
           *
           * @var string
           */
          protected $redirectTo = RouteServiceProvider::HOME;
      
          /**
           * Create a new controller instance.
           *
           * @return void
           */
          public function __construct()
          {
              $this->middleware('guest');
          }
      
          /**
           * Get a validator for an incoming registration request.
           *
           * @param  array  $data
           * @return \Illuminate\Contracts\Validation\Validator
           */
          protected function validator(array $data)
          {
              return Validator::make($data, [
                  'name' => ['required', 'string', 'max:255'],
                  'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
                  'password' => ['required', 'string', 'min:8', 'confirmed'],
              ]);
          }
      
          /**
           * Create a new user instance after a valid registration.
           *
           * @param  array  $data
           * @return \App\User
           */
          protected function create(array $data)
          {
              return User::create([
                  'name' => $data['name'],
                  'email' => $data['email'],
                  'password' => Hash::make($data['password']),
                  //下記を追加する
                  'marriage_flag' => 0,
              ]);
          }
      }
      
  3. 確認

    1. アプリ名ディレクトリで下記コマンドを実行してローカルサーバを起動する。

      $ php artisan serve
      
    2. 下記にアクセスする。

    3. ユーザの新規登録を行う。

    4. 下記コマンドを実行してターミナルからMySQLにログインする。

      $ mysql -u root -p
      
    5. 下記を実行してデータベース名の一覧を出力する。

      mysql> show databases;
      
    6. 下記を実行してLaravelアプリで使用しているDBを指定する。

      mysql> use データベース名;
      
    7. 下記を実行してusersテーブルのデータを出力する。

      mysql> select * from users;
      
    8. 新規登録したレコードのmarriage_flagカラムに0が格納されている事を確認する。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel立ち上げ、とりあえず動かしてみる。

学習のメモとしてlaravelの立ち上げを書いていきます。
前提としてcomposer等のインストールはすでに終えています。
この記事は速習Laravel6 という本を参考に書いています。

早速まずはターミナルで

composer create-project --prefer-dist laravel/laravel ファイル名

とすると、数多くのファイルがインストールされます。

php artisan serve

とすると、Laravelのサーバーが立ち上がります。

コントローラーを作成する

それが確認できたら、まずMVCのコントローラーから触っていきます。

コントローラーは、リクエストの受け取り、Modelの呼び出し、その結果をViewに反映という処理の司令塔です。

こんにちは、世界!という文字列を表示するサンプルを作ります。

php artisan make:controller HelloController

これでapp/http/Controllersフォルダ配下にHelloController.phpが生成されます。

HelloController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
+    public function index()
+    {
+        return 'こんにちは世界';
+    }
}

returnで文字列を出力するアクションメソッドを追加しました。

ルーティング

ルートを定義するのは幾つか方法があるが、

Route::get(path,action)

が最もシンプルなメソッド。
引数actionには「コントローラー名@アクション名」つまり

web.php
<?php

use App\Http\Controllers\HelloController;
use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});

+Route::get('/hello/', 'HelloController@index');

これで
スクリーンショット 2020-05-29 23.27.42.png
画面が出ました。

モデルの基本

モデルとは、データベース/外部サービスへのアクセスをはじめ、ビジネスロジックを担うコンポーネント。
アプリの心臓部とも言えます。

それではデータベースの連携についてみていきましょう。

マイグレーション/シード

マイグレーションとは、テーブルレイアウトの定義をスクリプトから表し、コマンドラインから実行するための仕組み。

では早速、マイグレーション経由でテーブルを作成してみましょう。

php artisan make:migration create_books_table

これでマイグレーションファイルが作成されました。

create_xxxxxx_tableはマイグレーションファイルの名前です。

/app/database/migrationsのフォルダー配下にマイグレーションファイルが生成されます。

create_books_table.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateBooksTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('books', function (Blueprint $table) {
+            $table->bigIncrements('id');
+            $table->string('isbn');
+            $table->string('title');
+            $table->integer('price');
+            $table->string('publisher');
+            $table->date('published');
+            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('books');
    }
}

テーブル情報を定義しました。

マイグレーションを実行する。

php artisan migrate

ここでエラーが出て実行できませんでした。

そもそもデータベースを作っていなかったので、MySQLでtutorialという
データベースを作成し、.envファイルの中の

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
+DB_DATABASE=tutorial
DB_USERNAME=root
DB_PASSWORD=

書き直します。

もう一度

php artisan migrate

スクリーンショット 2020-05-30 9.59.30.png

テーブルができているのが確認できます。

シーダー

このテーブルの中にダミーデータを入れていきたいと思います。これを行うのがシーダー

早速コマンドで自動生成しましょう。

php artisan make:seeder BooksTableSeeder

できたシーダーを編集します。

BooksTableSeeder.php
<?php

use Illuminate\Database\Seeder;

class BooksTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
+        DB::insert('insert into books (isbn, title,price,publisher,published) values ("978-4-8222-5399-8","Visual C# 2019超入門",2000,"日経BP" ,"2019-08-22")', [1, 'Dayle']);
    }
}

シーダーはそのまま実行できません。
対象のシーダーをアプリに登録しておく必要があります。

app/database/seeds フォルダー配下のDatabaseSeeder.phpを以下のように編集します。

DatabaseSeeder.php
<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
+        $this->call(BooksTableSeeder::class);

    }
}

シーダーを実行しましょう

php artisan db:seed

Database seeding completed successfully.
と出たらMySQLで確認してみましょう。
スクリーンショット 2020-05-30 10.25.06.png

ちゃんと入っていますね。

今回はこの辺で、次回はデータの取得などを行っていきます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む