Laravel Query Builder Join 子句忽略 orderBy()
Laravel Query Builder Join clause is ignoring orderBy()
我正在使用 Laravel 查询构建器,我想问一下,如果返回了很多行,如何指定左连接使用哪一行?
我有这样的代码:
$builder->leftJoin('table2', function (JoinClause $join) {
$join->on('table2.id', '=', "table1.id")
->on('table2.region', '=', "table1.region")
->orderBy('table2.updatedAt', 'DESC') // This is being ignored.
->limit(1);
});
$join->on()->on()
returns 部分有多行,所以我需要指定左连接使用哪一行。我虽然可以按 table2.updatedAt
对其进行排序,然后它将第一行用于左连接。但它完全忽略了 orderBy。所以我不知道如何获得一个特定的行。
编辑:
也有可能来自 table2 的某些行具有完全相同的 table2.updatedAt。在那种情况下,选择具有相同 table2.updatedAt 的哪个并不重要。
检查 laravel 中的查询,我发现应用 ORDER BY
不会对查询应用任何子句。
阅读您的要求,您希望针对指定的条件获得具有最大 updatedAt 字段的记录。如果允许,我个人会在视图中选择 MAX()
查询,但是 views
可以被组织限制或不使用,并且很高兴知道如何根据您的问题进行操作,加上它意味着您不必保持视图。或者,您可以在子查询中执行 MAX()
,但这需要更多设置。
首先,您在需要的字段上进行内部联接。其次,您执行左联接以在该联接中查找大于您想要 MAX
的值的值。所以我们想要最新的 updatedAt 字段。最后,你 WHERE
最大的 updatedAt 值没有比它大的值,所以它是真正的最大值:那个值是 NULL
.
代码在没有 leftJoin 子句对象的情况下重新混合,我到处传递你的构建器。我看不到您查询的其余部分,但我认为这应该直接插入,因为最多只有 2 个表,即 table2。如果您在 WHERE
子句中提供 1 table.id,您将返回 1 行。
更新:您需要对 ID 执行相同的操作,因此如果您有 2 个具有相同时间戳的日期时间,则选择 ID 较高的一个:
$sql->join('table2', function ($sql) {
$sql->on('table2.id', '=', "table1.id")
->on('table2.region', '=', "table1.region");
});
$builder->leftJoin('table2 AS biggerThanUpdatedAt', function ($builder) {
$builder->on('table2.id', '=', "biggerThanUpdatedAt.id")
->on('table2.region', '=', "biggerThanUpdatedAt.region")
->on('table2.updatedAt', '<', 'biggerThanUpdatedAt.updatedAt');
});
$builder->leftJoin('table2 AS biggerThanId', function ($builder) {
$builder->on('table2.id', '<', "biggerThanId.id") //<-notice the greater at is here this time.
->on('table2.region', '=', "biggerThanId.region")
->on('table2.updatedAt', '=', 'biggerThanId.updatedAt');
});
$builder->whereNull('biggerThanUpdatedAt.updatedAt');
$builder->whereNull('biggerThanId.id');
我正在使用 Laravel 查询构建器,我想问一下,如果返回了很多行,如何指定左连接使用哪一行?
我有这样的代码:
$builder->leftJoin('table2', function (JoinClause $join) {
$join->on('table2.id', '=', "table1.id")
->on('table2.region', '=', "table1.region")
->orderBy('table2.updatedAt', 'DESC') // This is being ignored.
->limit(1);
});
$join->on()->on()
returns 部分有多行,所以我需要指定左连接使用哪一行。我虽然可以按 table2.updatedAt
对其进行排序,然后它将第一行用于左连接。但它完全忽略了 orderBy。所以我不知道如何获得一个特定的行。
编辑: 也有可能来自 table2 的某些行具有完全相同的 table2.updatedAt。在那种情况下,选择具有相同 table2.updatedAt 的哪个并不重要。
检查 laravel 中的查询,我发现应用 ORDER BY
不会对查询应用任何子句。
阅读您的要求,您希望针对指定的条件获得具有最大 updatedAt 字段的记录。如果允许,我个人会在视图中选择 MAX()
查询,但是 views
可以被组织限制或不使用,并且很高兴知道如何根据您的问题进行操作,加上它意味着您不必保持视图。或者,您可以在子查询中执行 MAX()
,但这需要更多设置。
首先,您在需要的字段上进行内部联接。其次,您执行左联接以在该联接中查找大于您想要 MAX
的值的值。所以我们想要最新的 updatedAt 字段。最后,你 WHERE
最大的 updatedAt 值没有比它大的值,所以它是真正的最大值:那个值是 NULL
.
代码在没有 leftJoin 子句对象的情况下重新混合,我到处传递你的构建器。我看不到您查询的其余部分,但我认为这应该直接插入,因为最多只有 2 个表,即 table2。如果您在 WHERE
子句中提供 1 table.id,您将返回 1 行。
更新:您需要对 ID 执行相同的操作,因此如果您有 2 个具有相同时间戳的日期时间,则选择 ID 较高的一个:
$sql->join('table2', function ($sql) {
$sql->on('table2.id', '=', "table1.id")
->on('table2.region', '=', "table1.region");
});
$builder->leftJoin('table2 AS biggerThanUpdatedAt', function ($builder) {
$builder->on('table2.id', '=', "biggerThanUpdatedAt.id")
->on('table2.region', '=', "biggerThanUpdatedAt.region")
->on('table2.updatedAt', '<', 'biggerThanUpdatedAt.updatedAt');
});
$builder->leftJoin('table2 AS biggerThanId', function ($builder) {
$builder->on('table2.id', '<', "biggerThanId.id") //<-notice the greater at is here this time.
->on('table2.region', '=', "biggerThanId.region")
->on('table2.updatedAt', '=', 'biggerThanId.updatedAt');
});
$builder->whereNull('biggerThanUpdatedAt.updatedAt');
$builder->whereNull('biggerThanId.id');