質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.34%

Laravel DBにデータを登録できない

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,294

score 60

『追記』
laravelバージョン:6.18.40
PHPバージョン:7.2.31

『やっていること』
『Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう』というサイトの第4回の会員登録の箇所を実装しています。
実装の流れとしてはテストコードを作成→ルーティング設定→コントローラーの編集をしています。
多少オリジナルの実装をしています。
作成したテストコードを成功させたいです。

『テストコードの流れ』
テストコードの処理としては
①RegistersUsers.phpのregisterメソッドが呼ばれる
registerメソッドはバリデーションとaccountテーブルに登録を行っている
②accountテーブルから1行取得する
③登録するデータとテーブルに登録されているアカウント名が同名かチェックする
④レスポンスを返却する

『困っていること』
上記の処理の中でaccountテーブルにデータが登録できず困っています。
RegistersUsers.phpのregisterメソッドの中で$request->all()でリクエストの値を取得し
$account::create()で登録ができると思っていたのですがテーブルを確認してみると空っぽでした。
ただtinkerを使用して下記のようにcreateを行うとテーブルに登録ができました。

App\Models\Account::create(['login_id' => "test1234",'password' => "test1234",'account_name' => "test1234",'street_address' => "test1234"])


コントローラーからの登録ができない原因が分かる方がいたら教えていただきたいです。
よろしくお願いいたします。

『使用しているコード』
下記にコードをまとめておきます。
RegisterApiTest.php = phpunitのテストコード
RegistersUsers.php = RegisterController.phpのトレイト
RegisterController.php = コントローラー
api.php = ルート設定
Account.php = モデル

↓RegisterApiTest.php

<?php

namespace Tests\Feature;

use App\Models\Account;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;

class RegisterApiTest extends TestCase
{
    use RefreshDatabase;

    /**
     * @test
     */

    public function should_新しいユーザーを作成して返却する(){
        $data = [
            'login_id' => 'user',
            'password' => 'test1234',
            'account_name' => 'test1234',
            'street_address' => 'test1234',
        ];

        $response = $this->json('POST', route('register'), $data);//routeの/registerに$data送るPOST

        $account = new Account();
        $user = $account::first();//テーブルから1行取得
        $this->assertEquals($data['account_name'], $user->account_name);//2つの引数が一緒かどうか(登録するデータと登録されたデータが一緒かどうか)

        $response
            ->assertEquals(201)//201とはリクエストが成功してリソースの作成が完了している状態
            ->assertJson(['name' => "$user->account_name"]);//レスポンスを配列に変換する
    }
}


↓RegistersUsers.php

<?php

namespace Illuminate\Foundation\Auth;

use Illuminate\Auth\Events\Registered;
use Illuminate\Http\Request;
use App\Models\Account;
use Illuminate\Support\Facades\Auth;

trait RegistersUsers
{
    use RedirectsUsers;

    .
    .
    .

    /**
     * Handle a registration request for the application.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function register(Request $request,Account $account)
    {

        $this->validator($request->all());

        event(new Registered
            ($user = $account::create(
                    $request->all()
                )
            )
        );

        $this->guard()->login($user);

        return $this->registered($request, $user)
                        ?: redirect($this->redirectPath());
    }

    /**
     * The user has been registered.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  mixed  $user
     * @return mixed
     */
    protected function registered(Request $request, $user)
    {
        //
    }
}


↓RegisterController.php

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Models\Account;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Http\Request;

class RegisterController extends Controller
{
    .
    .
    .

    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array  $data
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function validator(Request $request)
    {
        // $Validator = $request->validate([
        $request->validate([
            'login_id' => ['required', 'string', 'max:256', 'unique:account,login_id'],
            'password' => ['required', 'string', 'max:512', 'min:100'],
            'account_name' => ['required', 'string', 'max:256'],
            'street_address' => ['nullable', 'string', 'max:256', 'confirmed'],
        ]);

        // $Validator->Validate();
    }

    /**
     * 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']),
    //     ]);
    // }

    protected function registered(Request $request, $user)
    {
        return $user;
    }

    // protected function accountCreate(array $data, Account $account){
    //     $return_data = $account->accountCreate($data);
    //     return $return_data;
    // }
}


↓api.php

<?php

use Illuminate\Http\Request;

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/

Route::post('/register', 'Auth\RegisterController@register')->name('register');


↓Account.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Account extends Model
{
    // テーブル名の指定
    protected $table = 'account';

    // fillableで設定
    protected $fillable = [
        'login_id', 'password', 'account_name', 'street_address',
    ];

}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2020/11/11 07:38

    コードブロックの冒頭はファイル名ではなく言語名にしてください。

    ```php

    ```html

    ファイル名は外に
    hoge.php
    ```php

    キャンセル

回答 2

+1

Laravelの話をする時はバージョン情報が最も重要。

先にこれをテストしてるからDBに登録できてないように見えるけどここを消して

$this->assertEquals($data['account_name'], $user->account_name);


これだけテストすれば本当の原因は別だと分かる。

$response->assertEquals(201);


おそらくルーティングの間違い。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/11/12 00:30

    コメントアウトしてunittestを行ってみましたが
    BadMethodCallException: Method Illuminate\Http\JsonResponse::assertEquals does not exist.
    と出てしまいました。
    assertEqualsが存在しませんと出ているようで$responseを受け取れていないのでassertEqualsもないよと言っているのでしょうか?

    キャンセル

  • 2020/11/12 00:36

    「Laravelの話をする時はバージョン情報が最も重要。」と回答に書かれているのに、その情報出さない人多すぎですね。このサイト。

    キャンセル

  • 2020/11/12 17:03

    失礼いたしました。
    laravelとphpのバージョンを追記いたしました。

    キャンセル

check解決した方法

0

testのために作成したRegisterApiTest.phpに記載されていた
use RefreshDatabase;←これが原因でした。
RefreshDatabaseトレイトを利用するとテスト後にデータを破棄してくれるためdbに登録されずに
エラーとなっていました。コメントアウトしたらデータが登録されていました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る