【问题标题】:Disabling MySQL Strict Mode only for one query Laravel 5.6仅对一个查询禁用 MySQL 严格模式 Laravel 5.6
【发布时间】:2019-01-03 04:19:30
【问题描述】:

我只想为控制器内的一个查询禁用 MySQL 严格模式,而不是整个 laravel 应用程序,

我知道禁用 MySQL 严格模式的风险,所以我不想从 config/database.php 为我的整个应用程序禁用它,

我的整个应用程序中只有一个查询存在问题,因此我想在我的控制器中禁用它,然后再运行该查询一次!

请帮助我在特定情况下有什么办法。

【问题讨论】:

  • 您需要哪个查询??
  • 通过查询在组中给出错误,我使用 laravel eloquent,App\DefaultMilestone::where('d_dept', $user_dept)->select('d_nature')->groupby(' d_nature')->get();当我删除选择时,它会给出错误
  • 我需要选择 * 或选择行的 id 至少与 group by。该表已经包含数据,我无法更改表的结构,当我从 config/database 禁用严格模式时,它不会给出任何错误
  • 但是如何在 laravel 中做到这一点

标签: php mysql laravel-5


【解决方案1】:

在 config/database.php 中,执行如下操作:

'连接'=> [

    'mysql' => [

        // Behave like MySQL 5.6

        'strict' => false,

        // Behave like MySQL 5.7
        'strict' => true,
    ]

]

【讨论】:

  • 会改变整个应用的严格模式,会有风险
【解决方案2】:

将此用于 MySQL ≤5.7(取自here):

DB::statement("set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'");
// your query
DB::statement("set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'");

【讨论】:

  • 它对我有用。你在执行什么查询?为什么会和严格模式冲突?
  • App\DefaultMilestone::where('d_dept', $user_dept)->select('d_nature')->groupby('d_nature')->get();
  • 为什么这个查询在严格模式下不起作用?什么错误?
  • 这是有效的,当我想选择 * 并按 b_nature 分组时,它会在严格模式下出错!
  • 你必须禁用ONLY_FULL_GROUP_BY,我更新了我的答案。
【解决方案3】:

您可以做的一件事是在运行时更改此值

public function doQueryWithoutStrictMode{
    config('database.connections.mysql.strict', false);
    DB::select('The query you want to make, and that should work!');

    And then, if you later want to do another query in strict mode withing the same 
    method you can enable it like this.

    config('database.connections.mysql.strict', true);

    DB::select('your other query with strict mode');

}

【讨论】:

  • 这个好像可以,但是我试过了还是不行,你试过了吗?
  • 我也试过这个 config(['database.connections.mysql.strict' => false]);
【解决方案4】:

在运行时更改严格模式

config()->set('database.connections.mysql.strict', false);
\DB::reconnect(); //important as the existing connection if any would be in strict mode
Model::select()->get(); // your query called in non strict mode

//now changing back the strict ON
config()->set('database.connections.mysql.strict', true);
\DB::reconnect();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-24
    • 2021-03-09
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 2018-09-10
    相关资源
    最近更新 更多