获取具有一个不同列的查询,Laravel
Get query with one distinct column, 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]: Grouping error: 7 ERROR: column
"customer_names.novation_date" must appear in the GROUP BY clause or
be used in an aggregate
如果我将其添加到 groupBy 以及名称和 ID,我不会收到任何错误,但结果是一样的。
左连接错误,请尝试以下格式
$query = customers::newQuery();
$query->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', 'customer_names.id', '=' ,customers.customer_id')->groupBy('customers.sage_id');
如果您需要不同的列,请在您的查询中添加 distinct() 方法
您必须在 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']);
在 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]: Grouping error: 7 ERROR: column "customer_names.novation_date" must appear in the GROUP BY clause or be used in an aggregate
如果我将其添加到 groupBy 以及名称和 ID,我不会收到任何错误,但结果是一样的。
左连接错误,请尝试以下格式
$query = customers::newQuery();
$query->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', 'customer_names.id', '=' ,customers.customer_id')->groupBy('customers.sage_id');
如果您需要不同的列,请在您的查询中添加 distinct() 方法
您必须在 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']);