ポイント
- エラーを読み解く
-
create
メソドを使用 - データの挿入を許可するプロパティの指定(
$fillable
or$guarded
) - 日付ミューテーターの指定
- フォームの
name
値とカラム名をつなげる
コード
<?php
namespace App\Http\Controllers\TestConnect;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Carbon\Carbon;
use App\Http\Model\Member;
use App\Http\Repository\MemberRepository;
class MemberController extends Controller
{
protected $request;
protected $member;
public function __construct(
Request $request,
MemberRepository $product
){
$this->request = $request;
$this->member = $member;
}
public function postMemberRegister(){
$formData = $this->request->all();
$this->member->addMember($formData);
return view('admin.member.complete');
}
}
<?php
namespace App\Http\Repository;
use Carbon\Carbon;
use App\Http\Model\Member;
class MemberRepository
{
public function __construct()
{
$this->now = Carbon::now();
}
public function addMember($data){
Member::create([
'name' => $formData["name"],
'email' => $formData["mail"],
'accountcode' => $formData["code"]
]);
}
}
<?php
namespace App\Http\Model;
use Illuminate\Database\Eloquent\Model;
class Member extends Model
{
protected $table = 'account';
protected $dates = [];
public $timestamps = false;
protected $fillable = [ 'name', 'email', 'accountcode' ];
}
エラー
MassAssignmentException
DBになんでもかんでもデータがぶちこまれると大変なので、Eloquentは $fillable
または $guarded
を使ってデータ挿入を許可するプロパティを与える必要がある。
$fillable(ホワイトリスト方式)
ホワイトリスト方式という。
protected $fillable = ["name", "email"];
これでテーブルの「name」「email」はデータ挿入が可能になる。
(Mass Assignmentできるようになる、というらしい)
$guarded(ブラックリスト方式)
protected $guarded = ["id", "created_at", "updated_at"];
今度は逆に「id」「created_at」「updated_at」はデータ挿入が不可、その他は可能となる。
SQLSTATE[42703]: Undefined column: ~
QueryException in Connection.php line 673:
SQLSTATE[42703]: Undefined column: 7 ERROR: column "updated_at" of >relation "account" does not exist
LINE 1: ...sert into "account" ("type", "name", "updated_a...
Eloquentではデフォルトでcreated
updated_at
を勝手に書き込むらしく、これは「書き込むとこないやんけ!」って怒ってるらしい。(今回のテーブルにこの2項目はなかった)
日付ミューテーター
Laravel公式ドキュメントにもこの辺のことは書いてある。
日付ミューテーターを使用する属性をEloquentに知らせるには、dates配列に属性名を追加するらしい。
このサイトもわかりやすかったです。
解決法
今回は 日付のカラムがない ので、以下を追記。
protected $dates = [];
public $timestamps = false;
これで 日付として認識するものはありません ということになるんだと思う。
$timestamps
はよくわかりませんが、ないとDBに挿入できなかったので。
フォームのname値とカラム名のリンク
下のコードのようにすると、フォームのname
値とカラム名が一致してないものはDBに挿入されないので注意。
Member::create($data);