Laravel 8 和 Livewire - 查询不起作用

Posted

技术标签:

【中文标题】Laravel 8 和 Livewire - 查询不起作用【英文标题】:Laravel 8 & Livewire - query not works 【发布时间】:2021-04-14 10:12:19 【问题描述】:

我正在使用 Laravel 8 和 Livewire 制作应用程序。 在我的reportResidui.blade.php 视图中,我集成了一个名为report-residui-header-filter 的livewire 组件,我用它来过滤(这个组件工作正常)。 当我执行查询时出现问题,我需要从一个表中过滤,以便使用 where 子句 where('importoResiduo', '>', '0') 对字段 anagrafica_soggetto.codiceFiscale 的数据进行分组。 但是当我运行查询时,我收到以下错误,我不明白它来自什么,因为删除 groupBy 子句有效。

有人有什么建议或意见吗?

错误:

SQLSTATE[42000]: Syntax error or access violation:
1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'tenantseed_prova_province.anagrafica_soggetto.denominazioneSoggetto'
which is not functionally dependent on columns in GROUP BY clause; 
this is incompatible with sql_mode=only_full_group_by (SQL: select distinct `denominazioneSoggetto`, `anagrafica_soggetto`.`codiceFiscale`, `indirizzoPOSTA`, `importoCarico` as `carico`,
`importoResiduo` as `residuo`, `pagatoNormale` as `riscosso`, `pagatoDiscarico` as `sgravio` from `anagrafica_soggetto` inner join `minuta_partita` on `minuta_partita`.`id_soggetto` = `anagrafica_soggetto`.`id` left outer join `users` on `minuta_partita`.`id_user` = `users`.`id` left outer join `partita_pagamenti` on `partita_pagamenti`.`id_minuta_partita` =
`minuta_partita`.`id` inner join `tipologia_imposta` on `minuta_partita`.`id_tipologia_imposta`
= `tipologia_imposta`.`id` where `importoResiduo` > 0 group by
`anagrafica_soggetto`.`codiceFiscale`)

带查询的 Livewire 组件:

<?php

namespace App\Http\Livewire;

use Livewire\Component;
use Illuminate\Http\Request;
use App\Models\MinutaPartita;
use App\Models\AnagraficaSoggetto;
use App\Models\TipologiaImposta;
use Illuminate\Support\Facades\DB;
use Livewire\WithPagination;
use App\Tenant;

class ReportResiduiHeaderFilter extends Component

    protected $paginationTheme = 'bootstrap';

    protected $connection = null;
    public $first_render = true;
    public $filtered = null;

    // Definiamo l'array dei filtri, e filtriamo se vogliamo raggruppare i filtri per CF del soggetto
    public $filter = [
        'group' => '' //indichiamo se raggruppare o meno (vuoto non si raggruppa, 1 si raggruppa per CF)
    ];

    public function mount(Request $request)
        
        if (null !== $request->get('throughMiddleware')) 
            $this->connection = 'tenant';
         else 
            $this->connection = null;
        

    

    public function filtri()

        if (null !== request()->get('throughMiddleware')) 
            $this->connection = 'tenant';
         else 
            $this->connection = null;
        

        $anagrafica = new AnagraficaSoggetto();
        $anagrafica->setConnection($this->connection);

        $pratiche = $anagrafica->select(
            'denominazioneSoggetto',
            'anagrafica_soggetto.codiceFiscale',
            'indirizzoPOSTA',
            'importoCarico as carico',
            'importoResiduo as residuo',
            'pagatoNormale as riscosso',
            'pagatoDiscarico as sgravio',
        )->distinct()
            ->join('minuta_partita', 'minuta_partita.id_soggetto', '=', 'anagrafica_soggetto.id')
            ->join('users', 'minuta_partita.id_user', '=', 'users.id', 'left outer')
            ->join('partita_pagamenti', 'partita_pagamenti.id_minuta_partita', '=', 'minuta_partita.id', 'left outer')
            ->join('tipologia_imposta', 'minuta_partita.id_tipologia_imposta', '=', 'tipologia_imposta.id');
        
        // recupero solo le pratiche che hanno residui non nulli
        $pratiche = $pratiche->where('importoResiduo', '>', 0);

        // if i remove this and i get the value by where clause it woks
        if ($this->filter['group'] != '') 
            $pratiche = $pratiche->groupBy('anagrafica_soggetto.codiceFiscale')->get();
        

        dd($pratiche);
    
    

    public function render()
    
        return view('livewire.report-residui-header-filter');
    


【问题讨论】:

【参考方案1】:

您正在尝试按anagrafica_soggetto.codiceFiscale 进行分组,但您的查询中有许多联接,因此您必须明确告诉 mysql 如何对选择列表中的其他选定项进行分组。

解决方案是按您要加入的每个表中的至少 1 个字段进行分组。

【讨论】:

以上是关于Laravel 8 和 Livewire - 查询不起作用的主要内容,如果未能解决你的问题,请参考以下文章

dompdf 没有从 Laravel 8 和 Livewire 视图下载 PDF

在 Laravel 8 Jetstream 的 Blade 组件中绑定 Livewire 属性

未找到 InvalidArgumentException 视图 [layouts.app]。 Laravel-8 LiveWire-2

Laravel 8 livewire 在任务完成或在其外部单击页面时隐藏菜单组件

使用 Jetstream 在 Laravel 8 中添加新 Livewire 组件时如何解决 RootTagMissingFromViewException 错误

Laravel 与 JetStream 和 LiveWire 不渲染(尾风)