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

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

ただいまの
回答率

88.76%

モデルの参照先テーブルを変更

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 181

kiki777

score 1

前提・実現したいこと

初めての質問ですが、よろしくお願いいたします。

○問題点
M_Userモデルの参照先をMySQLのm_userテーブルを参照する用に変更する。

モデルの参照テーブルを変更するために
protected $table = 'm_user';
をモデルに記載しているのに参照先が変わらない。

別でM_Circleモデルがあり、そちらは
protected $table = 'm_circle';
で参照先が切り替わりました。

発生している問題・エラーメッセージ

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'USER_ID' in 'where clause' (SQL: select count(*) as aggregate from `users` where `USER_ID` = メールアドレス)

該当のソースコード

ファイル名:M_User.php

<?php

namespace App;

use Illuminate\Contracts\Auth\MustVerifyEmail;
// use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\USER as Authenticatable;
use Illuminate\Notifications\Notifiable;

/**
 * @property int $USER_NO
 * @property string $USER_ID
 * @property string $PASSWORD
.
.
.

 */
class M_User extends Authenticatable
{
    use Notifiable;
    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'm_user';

    /**
     * The primary key for the model.
     *
     * @var string
     */
    protected $primaryKey = 'USER_NO';

    /**
     * Indicates if the IDs are auto-incrementing.
     *
     * @var bool
     */
    public $incrementing = false;

    /**
     * @var array
     */
    protected $fillable = ['USER_ID', 'PASSWORD',];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     *
     */
    protected $hidden = [
        'PASSWORD',
    ];

    /**
     * Get the password for the user.
     *
     * @return string
     */
    public function getAuthPassword()
    {
        return $this->PASSWORD;
    }
}

ファイル名:auth.php

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Authentication Defaults
    |--------------------------------------------------------------------------
    |
    | This option controls the default authentication "guard" and password
    | reset options for your application. You may change these defaults
    | as required, but they're a perfect start for most applications.
    |
    */

    'defaults' => [
        'guard' => 'web',
        'passwords' => 'm_user',
    ],
    // 'defaults' => [
    //     'guard' => 'web',
    //     'passwords' => 'users',
    // ],

    /*
    |--------------------------------------------------------------------------
    | Authentication Guards
    |--------------------------------------------------------------------------
    |
    | Next, you may define every authentication guard for your application.
    | Of course, a great default configuration has been defined for you
    | here which uses session storage and the Eloquent user provider.
    |
    | All authentication drivers have a user provider. This defines how the
    | users are actually retrieved out of your database or other storage
    | mechanisms used by this application to persist your user's data.
    |
    | Supported: "session", "token"
    |
    */

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'm_user',
        ],
        // 'web' => [
        //     'driver' => 'session',
        //     'provider' => 'users',
        // ],

        'api' => [
            'driver' => 'token',
            'provider' => 'm_user',
            'hash' => false,
        ],
        // 'api' => [
        //     'driver' => 'token',
        //     'provider' => 'users',
        //     'hash' => false,
        // ],
    ],

    /*
    |--------------------------------------------------------------------------
    | User Providers
    |--------------------------------------------------------------------------
    |
    | All authentication drivers have a user provider. This defines how the
    | users are actually retrieved out of your database or other storage
    | mechanisms used by this application to persist your user's data.
    |
    | If you have multiple user tables or models you may configure multiple
    | sources which represent each model / table. These sources may then
    | be assigned to any extra authentication guards you have defined.
    |
    | Supported: "database", "eloquent"
    |
    */

    'providers' => [
        'm_user' => [
            'driver' => 'eloquent',
            'model' => App\M_User::class,
        ],

        // 'users' => [
        //     'driver' => 'database',
        //     'table' => 'users',
        // ],
    ],

    /*
    |--------------------------------------------------------------------------
    | Resetting Passwords
    |--------------------------------------------------------------------------
    |
    | You may specify multiple password reset configurations if you have more
    | than one user table or model in the application and you want to have
    | separate password reset settings based on the specific user types.
    |
    | The expire time is the number of minutes that the reset token should be
    | considered valid. This security feature keeps tokens short-lived so
    | they have less time to be guessed. You may change this as needed.
    |
    */

    'passwords' => [
        'users' => [
            'provider' => 'm_user',
            'table' => 'password_resets',
            'expire' => 60,
            'throttle' => 60,
        ],
        // 'users' => [
        //     'provider' => 'users',
        //     'table' => 'password_resets',
        //     'expire' => 60,
        //     'throttle' => 60,
        // ],
    ],

    /*
    |--------------------------------------------------------------------------
    | Password Confirmation Timeout
    |--------------------------------------------------------------------------
    |
    | Here you may define the amount of seconds before a password confirmation
    | times out and the user is prompted to re-enter their password via the
    | confirmation screen. By default, the timeout lasts for three hours.
    |
    */

    'password_timeout' => 10800,

];

ファイル名:RegisterController.php

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use App\M_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');
    }

    protected function guard()
    {
        return Auth::guard('PASSWORD');
    }

    /**
     * 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, [
            'USER_ID' => ['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 M_User::create([
            'USER_ID' => $data['email'],
            'PASSWORD' => Hash::make($data['password']),
        ]);
    }
}

試したこと

・とにかくタイプミスがないか確認
・同じような問題に遭遇した人の記事探す(いくつか見つかるが、モデルに$table変数を再代入して切り替わっているため分からず...)

補足情報(FW/ツールのバージョンなど)

PHP:7.4.9
Laravel:7.0
MySQL:8.0

足りない情報あるかもしれません。
すぐに追加します!

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+1

RegisterController.phpのvalidotorメソッドを修正して解決しました!
m-oguraさん代替案をありがとうございました!

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

最低限の実装で検証したところ、$tableで指定した通りにm_userを参照できました。
エラーメッセージに出力されているSQLを実行している箇所は特定できてますでしょうか。

2020_09_18_222557_create_m_user.php

<?php

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

class CreateMUser extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('m_user', function (Blueprint $table) {
            $table->integer('USER_NO');
            $table->string('USER_ID');
            $table->string('PASSWORD');
            $table->primary('USER_NO');
        });
    }

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


M_UsersSeeder.php

<?php

use Illuminate\Database\Seeder;

class M_UsersSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('m_user')->insert([
            'USER_NO' => 1,
            'USER_ID' => 'a',
            'PASSWORD' => 'A',
        ]);
        DB::table('m_user')->insert([
            'USER_NO' => 2,
            'USER_ID' => 'b',
            'PASSWORD' => 'B',
        ]);
        DB::table('m_user')->insert([
            'USER_NO' => 3,
            'USER_ID' => 'c',
            'PASSWORD' => 'C',
        ]);
    }
}


M_User.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class M_User extends Model
{
    protected $table = 'm_user';
    protected $primaryKey = 'USER_NO';
    public $incrementing = false;
}


UserController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    public function GetQuery(Request $request) {
        \DB::enableQueryLog();
        $m_user = \App\M_User::where('USER_NO', $request['id'])->get();
        return \DB::getQueryLog();
    }
    public function GetUser(Request $request) {
        return \App\M_User::where('USER_NO', $request['id'])->get();
    }
}


web.php

<?php

use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});
Route::get('/query', 'UserController@GetQuery');
Route::get('/user', 'UserController@GetUser');


実行結果
クエリ取得
M_User取得

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

回答ありがとうございます。
m-ogura様の実装していただいたことは冒頭に記載の通りM_Circleテーブルで実現できました。
今回は認証テーブルなので少し事情が異なるかと思います。
M_UserモデルはAuthenticatableを継承することで認証機能を引き継いだかたちにしたいと思っています。
しかし、M_Userモデルの参照テーブルが変わらない次第です。

エラーメッセージに出力されているSQLを実行している箇所は特定できてますでしょうか。

こちらに関してはvendorの奥深い箇所にあるかと思いますが、直接は編集したくないと思っております。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/09/20 05:07 編集

    根本的な解決ではありませんが、DBにusersというViewを作成してはいかがでしょうか。

    create view users as select * from m_user;

    Authenticatableを継承すると$tableが効かない謎は残りますが、妥協案としてご検討ください。
    尚、「laravel migration view」でぐぐると、migrationでViewを作成する方法がヒットします。

    キャンセル

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

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

関連した質問

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