Laravel:構文エラーまたはアクセス違反:1055エラー


93

同じクエリでWhereInとGroupbyを使用して結果を取得したいと思います。

私はこれを試しました:

$loadids=explode("#@*",$reciptdet->loading_id);
$loadingdatas=DB::table('loading')->groupBy('vehicle_no')->whereIn('id',$loadids)->get();

しかし、私はこのエラーメッセージを受け取りました:

SQLSTATE [42000]:構文エラーまたはアクセス違反:1055'sbrtpt.loading.id 'はGROUPBYにありません(SQL:select * from load where id in(14、15、16)group by Vehicle_no)


groupByステートメントとwhereInステートメントを切り替えます
aynber 2016

その動作していない@aynber
Karthikvijayaveni

エラーメッセージ全体を印刷できますか?
aynber 2016

SQLSTATE [42000]:構文エラーまたはアクセス違反:1055'sbrtpt.loading.id 'はGROUPBYにありません(SQL:select * from loadingwhere idin(vehicle_no14、15、16 )group by )@aynber
Karthikvijayaveni

回答:


211

簡潔な答え

config\database.php- >"mysql"配列

'strict' => falseすべてを無効にするように設定します。

....または

でオプションを終了して'strict' => trueモードを追加できます"mysql"

'mysql' => [
       ...
       ....
       'strict' => true,
       'modes' => [
            //'ONLY_FULL_GROUP_BY', // Disable this to allow grouping by one column
            'STRICT_TRANS_TABLES',
            'NO_ZERO_IN_DATE',
            'NO_ZERO_DATE',
            'ERROR_FOR_DIVISION_BY_ZERO',
            'NO_AUTO_CREATE_USER',
            'NO_ENGINE_SUBSTITUTION'
        ],
 ]

詳細な回答

すべての厳密なオプションを無効にする必要はないかもしれません...この問題についてのこの回答をご覧ください。


2
素晴らしい解決策をありがとう。この問題は私の3時間を殺しました
SarowerJahan19年

LaravelのOracle接続でこの厳密モードをfalseに設定するにはどうすればよいですか?私を助けてください
VikasChauhan19年

@VikasChauhan、申し訳ありませんが、私は前にOracleを使用していない
Husam

3
これはうまくいきました!!! その設定を変更した後も同じエラーが発生する場合は、次のphp artisan config:cache
Altin

この種のハードコードされた回避策についての私の懸念は、私の頭の中に浮かぶような質問が次のようになるため、夜はよく眠れないような技術的負債を感じることです:Laravelと/またはMySQLの仕様が変更されますmodes(たとえば、その配列で指定されたモードの一部の追加/削除、さらに悪いことに、その配列で指定されたモードの1つの名前が変更されます)。だから、私はただ立ち去りstrict=true、何にも触れませmodeん。このような厳密な設定で動作するようにコードを更新します。ThisPractice === SleepWellEveryNight:)
DamilolaOlowookere20年

106

これはおそらくSQL_MODEの問題です。あなたのconfig/database.php、接続で、変更

strict => false

のように

'mysql' => [
    'driver' => 'mysql',
    'host' => env('DB_HOST', 'localhost'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'charset' => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix' => '',
    'strict' => false,
    'engine' => null,
],

1
この方法では、セキュリティ上の問題が発生する可能性があります@Antonio Carlos Ribeiro
Karthikvijayaveni 2016

安全だと思います。そうしないと、Laravelで無効にするオプションがありません。
アントニオカルロスリベイロ

10

config \ database.phpファイルを変更せずに

設定する'strict' => falseにはconfig\database.php可能性があり、セキュリティ上の問題。したがって、単純なLaravelソリューションを最初に呼び出しget()てからgroupBy('vehicle_no)

$loadids = explode("#@*", $reciptdet->loading_id);
$loadingdatas = DB::table('loading')->whereIn('id', $loadids)->get();
$grouped = $loadingdatas->groupBy('vehicle_no');

'strict' => falseの場合、適切な結果を得ることができませんでした。このソリューションは、クエリ時にグループデータを試す場合にうまく機能します。答えてくれてありがとう。
ireshanpathirana20年

6

groupByを雄弁に使用する場合は常に、groupBy関数で使用される列名をselect()関数に含めてください。

$loadids=explode("#@*",$reciptdet->loading_id);
$loadingdatas=DB::table('loading')->select('vehicle_no')->groupBy('vehicle_no')->whereIn('id',$loadids)->get();//add select('vehicle_no')

また、設定ファイルで厳密モードを無効にすることは悪い習慣です。これを行うと、警告なしに無効な日付などの破損したデータがデータベースに入力される可能性があります。絶対に必要な場合を除いて、これを行わないでください。


-> select( 'column')の追加は私のために働いた。ありがとうバディ:)
シャーン

5

私もこの問題を抱えていましたが、変更した後 'strict' => true'strict' => falseエラーが消えました。

この設定は次の場所にあります。

config \ database.php

'mysql' => [
    ...
    'strict' => false,
    ...
]

どのように我々はlaravelでOracle connectiionのためにそれを行うことができます
ヴィカスChauhan

3

更新 config/database.php

セットする:

'mysql' => [
           'strict' => false,
        ],

の代わりに:

'mysql' => [
           'strict' => true,
        ],

キャッシュをクリアすることを忘れないでください:

php artisan config:cache

2016年に返信されることに加えて、私があなたに1000回投票できれば、私はそうします。キャッシュされている手がかりなしで約24時間それを叩きます。Love you man <3
Faisal MehmoodAwan20年

2

この制限はGROUP BY、MySQLで使用する場合、で使用される列の値ごとに1行を返すため意味があります。GROUP BY。したがって、選択した行の他の列の値は、どこでも使用しても意味がありません。したがって、常にベストプラクティスを使用することをお勧めします。また、MySQL厳密モードを無効にしないことをお勧めします。

多くの場合、開発者は、列の値でグループ化されたクエリの行を必要とする場合があります。ここでは、列の一意の値ごとに1つの行だけが必要なわけではありません。ただし、特定の列の一意の値でグループ化された複数の行が必要です。何らかの理由でgroupBy、MySQLGROUP BYクエリを生成するLaravelのクエリビルダーメソッドを使用し、開発者は上記のエラーに遭遇します。

彼らの問題の解決策は、groupBy代わりにコレクションメソッドを使用することです。例えば、

$loadingData = DB::table('loading')
    ->whereIn('id', $loadIds)
    ->get()
    ->groupBy('vehicle_no');

これは彼らに望ましい結果を与えるでしょう。


0

次のものを使用することもできます。

個別( 'vehicle_no')

groupBy( '​​vehicle_no')の代わりに、各ケースシナリオは異なりますが、クエリを見ると、データを集約していないため、異なる方法が使用される可能性があります。


-1

追加\Schema::defaultStringLength(191);するboot方法

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
         \Schema::defaultStringLength(191);
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.