【问题标题】:Laravel using incorrect table name when creating a modelLaravel 在创建模型时使用了错误的表名
【发布时间】:2017-07-28 07:59:31
【问题描述】:

我正在使用 Eloquent 在我的 Laravel 应用程序中创建模型。我不确定我做了什么更改,但现在当我尝试创建 AppUser 的新实例时收到此错误:

Next exception 'Illuminate\Database\QueryException' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'gonote.appusers' doesn't exist (SQL: select count(*) as aggregate from `appUsers` where `email` = user-4720@gonote.co)' in /Users/james/projects/GoNote/laravel/vendor/laravel/framework/src/Illuminate/Database/Connection.php:647
Stack trace:
  0 ./vendor/laravel/framework/src/Illuminate/Database/Connection.php(607): Illuminate\Database\Connection->runQueryCallback('select count(*)...', Array, Object(Closure))
  1 ./vendor/laravel/framework/src/Illuminate/Database/Connection.php(326): Illuminate\Database\Connection->run('select count(*)...', Array, Object(Closure))
  2 ./vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(1719): Illuminate\Database\Connection->select('select count(*)...', Array, false)
  3 ./vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(1703): Illuminate\Database\Query\Builder->runSelect()
  4 ./vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2094): Illuminate\Database\Query\Builder->get(Array)
  5 ./vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2022): Illuminate\Database\Query\Builder->aggregate('count', Array)
  6 ./vendor/laravel/framework/src/Illuminate/Validation/DatabasePresenceVerifier.php(55): Illuminate\Database\Query\Builder->count()
  7 ./vendor/laravel/framework/src/Illuminate/Validation/Concerns/ValidatesAttributes.php(614): Illuminate\Validation\DatabasePresenceVerifier->getCount('appUsers', 'email', 'user-4720@gonot...', NULL, NULL, Array)
  8 ./vendor/laravel/framework/src/Illuminate/Validation/Validator.php(338): Illuminate\Validation\Validator->validateUnique('email', 'user-4720@gonot...', Array, Object(Illuminate\Validation\Validator))
  9 ./vendor/laravel/framework/src/Illuminate/Validation/Validator.php(253): Illuminate\Validation\Validator->validateAttribute('email', 'unique:appUsers')
  10 ./vendor/laravel/framework/src/Illuminate/Validation/Validator.php(278): Illuminate\Validation\Validator->passes()
  11 ./app/Http/Controllers/Auth/RegisterController.php(25): Illuminate\Validation\Validator->fails()
  12 [internal function]: App\Http\Controllers\Auth\RegisterController->postRegister(Object(Illuminate\Http\Request))
  13 ./vendor/laravel/framework/src/Illuminate/Routing/Controller.php(55): call_user_func_array(Array, Array)
  14 ./vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(44): Illuminate\Routing\Controller->callAction('postRegister', Array)
  15 ./vendor/laravel/framework/src/Illuminate/Routing/Route.php(204): Illuminate\Routing\ControllerDispatcher->dispatch(Object(Illuminate\Routing\Route), Object(App\Http\Controllers\Auth\RegisterController), 'postRegister')
  16 ./vendor/laravel/framework/src/Illuminate/Routing/Route.php(160): Illuminate\Routing\Route->runController()
  17 ./vendor/laravel/framework/src/Illuminate/Routing/Router.php(559): Illuminate\Routing\Route->run()
  18 ./vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(30): Illuminate\Routing\Router->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
  19 ./app/Http/Middleware/RedirectIfAuthenticated.php(24): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
  20 ./vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(148): App\Http\Middleware\RedirectIfAuthenticated->handle(Object(Illuminate\Http\Request), Object(Closure))
  21 ./vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
  22 ./vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(41): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
  23 ./vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(148): Illuminate\Routing\Middleware\SubstituteBindings->handle(Object(Illuminate\Http\Request), Object(Closure))
  24 ./vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
  25 ./vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php(49): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
  26 ./vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(148): Illuminate\Routing\Middleware\ThrottleRequests->handle(Object(Illuminate\Http\Request), Object(Closure), '60', '1')
  27 ./vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
  28 ./vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(102): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
  29 ./vendor/laravel/framework/src/Illuminate/Routing/Router.php(561): Illuminate\Pipeline\Pipeline->then(Object(Closure))
  30 ./vendor/laravel/framework/src/Illuminate/Routing/Router.php(520): Illuminate\Routing\Router->runRouteWithinStack(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request))
  31 ./vendor/laravel/framework/src/Illuminate/Routing/Router.php(498): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request))
  32 ./vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(174): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request))
  33 ./vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(30): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}(Object(Illuminate\Http\Request))
  34 ./vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(30): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
  35 ./vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(148): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle(Object(Illuminate\Http\Request), Object(Closure))
  36 ./vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
  37 ./vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(30): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
  38 ./vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(148): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle(Object(Illuminate\Http\Request), Object(Closure))
  39 ./vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
  40 ./vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
  41 ./vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(148): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle(Object(Illuminate\Http\Request), Object(Closure))
  42 ./vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
  43 ./vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php(46): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
  44 ./vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(148): Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle(Object(Illuminate\Http\Request), Object(Closure))
  45 ./vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
  46 ./vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(102): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
  47 ./vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(149): Illuminate\Pipeline\Pipeline->then(Object(Closure))
  48 ./vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(116): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request))
  49 ./public/index.php(54): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request))
  50 ./server.php(21): require_once('/Users/james/pr...')
  51 {main}

查询失败是有道理的,因为表名为app_users 而不是appUsers。但是,我对所有查询都使用 Eloquent,所以我没有手写任何内容。我尝试将protected $table = 'app_users' 添加到我的AppUser 模型类中,但它似乎仍在查询错误的表。

这是创建模型的函数:

protected function create(array $fields)
{
    return AppUser::create([
        'email' => $fields['email'],
        'name' => $fields['name'],
        'photo' => $fields['photo'],
        'phone' => $fields['phone'],
        'password' => bcrypt($fields['password'])
    ]);
}

模型/AppUser.php

<?php

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Backpack\CRUD\CrudTrait;
use Laravel\Passport\HasApiTokens;

class AppUser extends Authenticatable
{
    use CrudTrait, HasApiTokens;

    protected $table = 'app_users';
    //protected $primaryKey = 'id';
    // public $timestamps = false;
    // protected $guarded = ['id'];
    protected $fillable = ['email', 'password', 'name', 'photo', 'phone', 'api_token'];
    protected $hidden = ['password'];
    // protected $dates = [];

    /*
    |--------------------------------------------------------------------------
    | FUNCTIONS
    |--------------------------------------------------------------------------
    */
    public function getAuthIdentifier() {
        return $this->getKey();
    }

    public function getAuthPassword() {
        return $this->password;
    }

    public function findForPassport($username) {
        return $this->where('email', $username)->first();
    }
}

【问题讨论】:

  • 当您将protected $table = 'app_users' 添加到您的模型时,您会收到与您的问题中的错误消息相同的错误消息吗?
  • @jackel414 添加不会改变任何东西。我也粘贴了错误的错误。我在帖子中更正了。
  • 您可以粘贴您的型号代码吗?如果它很大,则不是所有内容 - 只是声明和相关方法
  • 当然。已将其添加到帖子中。

标签: php mysql laravel


【解决方案1】:

看起来问题是由验证引起的 - 失败的查询似乎是唯一的验证器。检查您在哪里对电子邮件地址进行唯一验证并正确传递表名。

【讨论】:

  • 添加评论,因为这个答案引导我走向正确的方向。在进行功能测试时,assertDatabaseHas 还需要正确的表名。我打错了一个字符并返回同样的错误。
【解决方案2】:

查看堆栈跟踪。您正在添加一个新用户,并且有一个 Validatoremail|unique:appUsers 规则。您只需在此处修复表名即可。

    return Validator::make($data, [
        'name' => 'required|max:255',
        'email' => 'required|email|max:255|unique:app_users', // here
        'password' => 'required|min:6|confirmed',
    ]);

【讨论】:

  • 这就是问题所在。谢谢你。我接受了另一个答案,因为他的发布时间稍早。
猜你喜欢
  • 1970-01-01
  • 2013-03-21
  • 2020-08-25
  • 2017-07-21
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多