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)
loading
whereid
in (14, 15, 16) group byvehicle_no
) @aynberRespostas:
Resposta curta
Em
config\database.php
->"mysql"
arrayDefina
'strict' => false
para desativar tudo..... ou
Você pode sair
'strict' => true
e 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.
fonte
php artisan config:cache
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 sairstrict=true
e não vou tocar emmode
nada. Prefiro atualizar meu código para trabalhar com essa configuração estrita.ThisPractice === SleepWellEveryNight
:)Este é provavelmente um problema SQL_MODE . Na sua
config/database.php
, na conexão, mudestrict => 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, ],
fonte
Sem modificar o arquivo config \ database.php
Definir
'strict' => false
noconfig\database.php
pode ser um problema de segurança . Então, uma solução simples do Laravel poderia ser primeiro ligarget()
e depoisgroupBy('vehicle_no)
:$loadids = explode("#@*", $reciptdet->loading_id); $loadingdatas = DB::table('loading')->whereIn('id', $loadids)->get(); $grouped = $loadingdatas->groupBy('vehicle_no');
fonte
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.
fonte
Eu estava tendo esse problema também, mas depois de mudar
'strict' => true
para'strict' => false
, o erro desapareceu.Você pode encontrar essa configuração em:
config \ database.php
'mysql' => [ ... 'strict' => false, ... ]
fonte
Esta restrição faz sentido, pois quando você usa
GROUP BY
no MySQL, ela retorna uma linha para cada valor nas colunas usadas emGROUP 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
groupBy
método Query Builder do Laravel que gera umaGROUP BY
consulta MySQL e os desenvolvedores encontram o erro acima.A solução para o problema deles é usar o
groupBy
método Collection. Por exemplo,$loadingData = DB::table('loading') ->whereIn('id', $loadIds) ->get() ->groupBy('vehicle_no');
Isso lhes dará o resultado desejado.
fonte
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:
fonte
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.
fonte
adicionar
\Schema::defaultStringLength(191);
aoboot
métodoclass AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { // } /** * Bootstrap any application services. * * @return void */ public function boot() { // \Schema::defaultStringLength(191); } }
fonte