LoginSignup
9
11

More than 5 years have passed since last update.

Eloquentのcreateメソドを使ったデータの挿入

Last updated at Posted at 2016-05-28

ポイント

  • エラーを読み解く
  • createメソドを使用
  • データの挿入を許可するプロパティの指定($fillable or $guarded
  • 日付ミューテーターの指定
  • フォームの name値とカラム名をつなげる

コード

MemberController.php
<?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');
    }
}
MemberRepository.php
<?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"]
        ]);
    }
}
Member.php
<?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(ホワイトリスト方式)

ホワイトリスト方式という。

Model.php
    protected $fillable = ["name", "email"];

これでテーブルの「name」「email」はデータ挿入が可能になる。
(Mass Assignmentできるようになる、というらしい)

$guarded(ブラックリスト方式)

Member.php
    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配列に属性名を追加するらしい。
このサイトもわかりやすかったです。

解決法

今回は 日付のカラムがない ので、以下を追記。

Member.php
protected $dates = [];
public $timestamps = false;

これで 日付として認識するものはありません ということになるんだと思う。
$timestamps はよくわかりませんが、ないとDBに挿入できなかったので。

フォームのname値とカラム名のリンク

下のコードのようにすると、フォームのname値とカラム名が一致してないものはDBに挿入されないので注意。

MemberRepository.php
    Member::create($data);
9
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
9
11