首页 > 解决方案 > 使用一个不同的列获取查询,Laravel

问题描述

customer_names我得到一个值数组,从那里我只想得到第一个created_at值。使用我当前的代码,我得到多行,其中的所有值来自customer_names.

$query = $this->customer->newQuery()->select(
      'customers.id',
      'customers.sage_id',
      'customers.account_name',
      'customer_names.name as name',
      'customer_names.novation_date as novation_date',
    )->withCount('contracts');
$query->leftJoin('customer_names', 'customers.id', 'customer_names.customer_id')->groupBy('customers.sage_id');

我也尝试了另一种方法,但我得到一个空数组:

$query = $this->customer->newQuery()->with([
    'customerNames' => function ($query){
        $query->oldest()->first();
    }
])

“SQLSTATE [42803]:分组错误:7 错误:列“customer_names.novation_date”必须出现在 GROUP BY 子句中或在聚合中使用

如果我将此添加到 groupBy 以及名称和 ID,我不会收到任何错误,但结果是相同的。

在此处输入图像描述

标签: laravellaravel-7

解决方案


您必须在 Laravel 应用程序中关闭严格模式。

config/database.php

MySQL 集下

strict => false

它将开始工作。

这是数据库设置

'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => false,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],

如果您使用的是 Postgres

然后,您必须将所有列添加到您在 SELECT 中提到的组中

$query = $this->customer->newQuery()->select(
      'customers.id',
      'customers.sage_id',
      'customers.account_name',
      'customer_names.name as name',
      'customer_names.novation_date as novation_date',
    )->withCount('contracts');
$query->leftJoin('customer_names', 'customers.id', 'customer_names.customer_id')->groupBy(['customers.sage_id', 'customers.account_name', 'name', 'novation_date']);

推荐阅读