- 投稿日:2020-05-30T16:30:03+09:00
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.phpL297foreach ((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はそのまま使っているのでありえないとは思うのですが。
- 投稿日:2020-05-30T16:02:57+09:00
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から立ち上げてしまうが、基本に忠実に行動しましょう、というお話でした。
- 投稿日:2020-05-30T13:12:32+09:00
チャットアプリで、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はグループ作成者です。いざという時の拡張性を考えて入れときました。
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時間とか勉強した挙句のそれです。
僕が要領悪いだけかもしれませんが、是非僕のような初心者の方の役に立てたら幸いです。
- 投稿日:2020-05-30T13:12:06+09:00
朝飯前に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 -lPHPのバージョンが更新されたら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 TechnologiesHomebrewからインストールした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:10SQLite
データベースは何でもいいですが、今回は導入が手軽なSQLiteにします。
$ brew install sqlite$ sqlite3 --version 3.28.0 2019-04-15 14:49:49 378230ae7f4b721c8b8d83c8ceb891449685cd23b1702a57841f1be40b5daaplLaravelインストーラ
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 -lLaravelのインスール
上記の作業は寝る前に事前に済ませておきましょう。
Laravelのインストールはもはや朝飯前です。$ laravel new blog$ cd blog $ php artisan --version Laravel Framework 7.13.0Laravelビルトインサーバを起動する
$ php artisan serve
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の環境構築の記事をいくつか書いているのでよかったら読んでもらえたら嬉しいです!
(情報が古くなってるものもありますが...)
- 投稿日:2020-05-30T11:14:22+09:00
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を用いたユーザ認証機能のあるLaravelアプリが存在していること。
- そのアプリは既存マイグレーションファイルのマイグレートが完了していること。
- 今回紹介する手順の中で実行するカラムは
$ laravel new
コマンドで作成されたアプリ名ディレクトリ内で実行するものとする。実施したい事
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が格納されている時はその他をお見する。
概要
- カラムの追加
- 登録処理の値追加
- 確認
概要
カラムの追加
下記コマンドを実行してマイグレーションファイルを作成する。
$ php artisan make:migration add_marriage_flag_column_to_users_table --table=users下記コマンドを実行して先に作成したマイグレーションファイルを開く(yyyy_mm_ddはマイグレーションファイルの作成日)
$ vi database/migrations/yyyy_mm_dd_XXXXXX_add_marriage_flag_column_to_users_table.php開いたマイグレーションファイルを下記の様に修正しする。
アプリ名ディレクトリ/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); }); } }下記を実行してマイグレーションを実行する。
$ php artisan migrate登録処理の値追加
下記コマンドを実行してユーザ登録時に実行されるコントローラファイルを開く。
$ vi app/Http/Controllers/Auth/RegisterController.php開いたコントローラファイルを下記の様に修正して初期値を指定する。
アプリ名ディレクトリ/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, ]); } }確認
アプリ名ディレクトリで下記コマンドを実行してローカルサーバを起動する。
$ php artisan serve下記にアクセスする。
ユーザの新規登録を行う。
下記コマンドを実行してターミナルからMySQLにログインする。
$ mysql -u root -p下記を実行してデータベース名の一覧を出力する。
mysql> show databases;下記を実行してLaravelアプリで使用しているDBを指定する。
mysql> use データベース名;下記を実行してusersテーブルのデータを出力する。
mysql> select * from users;新規登録したレコードのmarriage_flagカラムに0が格納されている事を確認する。
- 投稿日:2020-05-30T11:08:10+09:00
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');モデルの基本
モデルとは、データベース/外部サービスへのアクセスをはじめ、ビジネスロジックを担うコンポーネント。
アプリの心臓部とも言えます。それではデータベースの連携についてみていきましょう。
マイグレーション/シード
マイグレーションとは、テーブルレイアウトの定義をスクリプトから表し、コマンドラインから実行するための仕組み。
では早速、マイグレーション経由でテーブルを作成してみましょう。
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テーブルができているのが確認できます。
シーダー
このテーブルの中にダミーデータを入れていきたいと思います。これを行うのがシーダー
早速コマンドで自動生成しましょう。
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:seedDatabase seeding completed successfully.
と出たらMySQLで確認してみましょう。
ちゃんと入っていますね。
今回はこの辺で、次回はデータの取得などを行っていきます。