Laravel: Erro de sintaxe ou violação de acesso: Erro 1055

93

Eu quero usar WhereIn e Groupby na mesma consulta para buscar o resultado.

Eu tentei isso:

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

Mas recebi esta mensagem de erro:

SQLSTATE [42000]: Erro de sintaxe ou violação de acesso: 1055 'sbrtpt.loading.id' não está em GROUP BY (SQL: select * from loading where id in (14, 15, 16) group by vehicle_no)

Karthikvijayaveni
fonte
Alterne suas instruções groupBy e whereIn
aynber
Não está funcionando @aynber
Karthikvijayaveni
Você pode imprimir sua mensagem de erro completa?
aynber 01 de
SQLSTATE [42000]: Erro de sintaxe ou violação de acesso: 1055 'sbrtpt.loading.id' não está em GROUP BY (SQL: select * from loadingwhere idin (14, 15, 16) group by vehicle_no) @aynber
Karthikvijayaveni

Respostas:

212

Resposta curta

Em config\database.php-> "mysql"array

Defina 'strict' => falsepara desativar tudo.

.... ou

Você pode sair 'strict' => truee adicionar modos à "mysql"opção em

'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'
        ],
 ]

Resposta detalhada

Talvez você não precise desativar todas as opções restritas ... Por favor, dê uma olhada nesta resposta sobre este problema.

Husam
fonte
2
Obrigado por uma ótima solução. esse problema matou minhas 3 horas
Sarower Jahan
Como podemos definir este modo estrito como falso na conexão oracle no laravel? Por favor me ajude
Vikas Chauhan
@VikasChauhan, Desculpe, não usei Oracle antes
Husam
3
Isso funcionou !!! Para qualquer pessoa que ainda esteja recebendo o mesmo erro após alterar essa configuração, tente limpar o cache de configuração executandophp artisan config:cache
Altin
Minha preocupação com esse tipo de solução alternativa codificada é que sinto algum tipo de dívida técnica que não me fará dormir bem à noite, porque o tipo de perguntas que estarão flutuando na minha cabeça serão: o que acontece quando o Laravel e / ou alterações de especificações do MySQL escritas modes(por exemplo, adição / remoção de alguns dos modos especificados naquele array, ou pior ainda, o nome de um dos modos especificados nesse array muda). Então, eu acabo de sair strict=truee não vou tocar em modenada. Prefiro atualizar meu código para trabalhar com essa configuração estrita. ThisPractice === SleepWellEveryNight:)
Damilola Olowookere
106

Este é provavelmente um problema SQL_MODE . Na sua config/database.php, na conexão, mude

strict => false

Como em

'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,
],
Antonio Carlos Ribeiro
fonte
1
Neste Método pode fazer qualquer problema de segurança @Antonio Carlos Ribeiro
Karthikvijayaveni 02/12/16
Eu acredito que é seguro ou você não teria uma opção no Laravel para desativá-lo.
Antonio Carlos Ribeiro
10

Sem modificar o arquivo config \ database.php

Definir'strict' => false no config\database.phppode ser um problema de segurança . Então, uma solução simples do Laravel poderia ser primeiro ligar get()e depoisgroupBy('vehicle_no) :

$loadids = explode("#@*", $reciptdet->loading_id);
$loadingdatas = DB::table('loading')->whereIn('id', $loadids)->get();
$grouped = $loadingdatas->groupBy('vehicle_no');
resposta
fonte
Não consegui obter o resultado adequado quando 'estrito' => falso. então esta solução funcionará bem se você tentar dados de grupo durante a consulta. Obrigado pela resposta.
ireshan pathirana
6

Sempre que usar groupBy no eloquent, sempre inclua o nome da coluna usada na função groupBy na função select ().

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

Também é uma prática ruim desativar o modo estrito no arquivo de configuração. Isso pode causar a entrada de dados corrompidos no banco de dados, como datas inválidas, sem nenhum aviso. Não faça isso a menos que seja absolutamente necessário.

Thungdemo
fonte
A adição de -> select ('coluna') funcionou para mim. Obrigado amigo :)
Shaan
5

Eu estava tendo esse problema também, mas depois de mudar 'strict' => truepara 'strict' => false, o erro desapareceu.

Você pode encontrar essa configuração em:

config \ database.php

'mysql' => [
    ...
    'strict' => false,
    ...
]
Zakhele
fonte
Como podemos fazer isso para a conexão do oráculo em laravel
Vikas Chauhan
3

Esta restrição faz sentido, pois quando você usa GROUP BYno MySQL, ela retorna uma linha para cada valor nas colunas usadas em GROUP BY. Portanto, os valores de outras colunas nas linhas selecionadas não fazem sentido para usar em qualquer lugar. Portanto, é sempre recomendável usar a prática recomendada e não desabilitar o modo estrito do MySQL.

Freqüentemente, os desenvolvedores podem precisar de linhas de uma consulta agrupadas pelo valor de uma coluna. Aqui, eles não precisam de apenas uma linha para os valores exclusivos das colunas. Mas eles precisam de várias linhas agrupadas pelos valores exclusivos de uma coluna específica. Por alguma razão, eles usam o groupBymétodo Query Builder do Laravel que gera uma GROUP BYconsulta MySQL e os desenvolvedores encontram o erro acima.

A solução para o problema deles é usar o groupBymétodo Collection. Por exemplo,

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

Isso lhes dará o resultado desejado.

Debiprasad
fonte
3

atualizar config/database.php

conjunto:

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

ao invés de:

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

e não se esqueça de limpar o cache:

php artisan config:cache
Gouda Elalfy
fonte
além de ser respondido em 2016 se eu puder votar mil vezes, eu votarei. batendo com ele por cerca de 24 horas sem qualquer pista de que ele estava em cache. Te amo homem <3
Faisal Mehmood Awan
0

Você também pode usar:

distinto ('veículo_no')

em vez de groupBy ('vehicle_no'), cada cenário de caso é diferente, mas olhando para sua consulta, distinto pode ser o caminho a percorrer, já que você não está agregando dados.

ben.c
fonte
-1

adicionar \Schema::defaultStringLength(191);ao bootmétodo

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);
    }
}
hamed hossani
fonte