【问题标题】:laravel custom request changes sql tablelaravel 自定义请求更改 sql 表
【发布时间】:2020-06-11 17:50:46
【问题描述】:

我提出了一个自定义验证请求

    class StoreModule extends FormRequest
{

    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'name' => 'required|unique:posts|max:50',
            'period' => 'required|integer|min:1',
            'block' => 'required|integer|min:1', 
            'study_points' => 'required|integer|min:1', 
            'my_teacher_id' => 'required',
            'tags' => 'required', 
            'coordinator_id' => 'required', 
            'category' => 'required|max:50', 
            'deadline' => 'required'
        ];
    }
}

但是当我将这个类应用到我的控制器时

public function store(StoreModule $request)
{
    $module = Module::create($request->all());
    $module->tags()->sync($request->tags);

    return redirect()->route('admin.index');
}

我突然收到一个 SQL 错误

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'mydatabase.posts' doesn't exist

当我用常规请求替换 StoreModule extends FormRequest 类时,一切工作正常,对象存储在我的 mydatabase.modules 表中。

为什么 laravel 突然找 mydatabase.posts 表?我已经尝试过声明 public $table = 'modules'; 在我的模块模型类中

感谢任何提示或帮助。请询问我是否需要提供更多详细信息

【问题讨论】:

  • 你在使用另一个数据库连接吗?如果是,您应该在验证规则中添加连接名称。例如'name' => 'required|unique:mydatabase.posts|max:50', -> 此规则正在访问您的帖子表

标签: laravel validation request


【解决方案1】:

我遇到了这样的问题,我用中间件解决了。不可能是最好的方法,但解决了问题。由于我在项目中使用了不同的数据库连接,所以这个中间件就派上用场了:)

在您的代码中,您使用 public 定义了 $table,但应该像这样受到保护:

protected $table = 'table name';

拿这段代码,它是我写的中间件。

public function handle($request, Closure $next, $database)
{
    // check witch database connection to use
    switch ($database) {
        case 'lamimail':
            // Set the User Database Connection
            DB::setDefaultConnection('lamimail');
            // Reconnect
            DB::reconnect();
            break;
        case 'lamiapps':
            // Set the User Database Connection
            DB::setDefaultConnection('lamiapps');
            // Reconnect
            DB::reconnect();
            break;
        default:
            // default action
            abort(403, 'Não está autorizado a aceder ao recurso solicitado.');
            break;
    }
    // next request...
    return $next($request);
}

在函数或__construct中调用它:

$this->middleware('SetDatabaseConnection:lamimail');

请记住,switch() 中的 case 条件是与位于 config/database.php 中的 DB 的连接名称。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 2021-04-30
    • 2017-05-20
    • 2017-11-17
    • 2018-03-08
    • 1970-01-01
    • 2017-12-06
    相关资源
    最近更新 更多