按相关 table 值排序(包括不存在关系的元素)
Sorting on related table value (including elements without existing relation)
假设我有两个表:用户和组织
users:
id int,
name varchar,
type int,
deleted bool
organisations:
id int,
name varchar
deleted bool
并且我想按类型 1 名称的用户对组织进行排序。我知道当我想按关系值排序时我必须使用 join:
$organisationsModel -> join( 'users', 'organisations.id', '=', 'users.organisationId', 'left' )
-> select( 'organisations.*', 'users.name as userName' )
-> where( 'users.type', 1 )
-> where( 'users.deleted', 0 )
-> orderBy( 'userName', 'ASC );
但它仅显示具有类型 1 用户(已删除设置为 0)的组织,我的问题是:我可以将此查询修改为也 return 值而没有适当的用户连接吗?
您需要一个带有附加连接子句的左连接才能获得所有组织,要对结果进行排序,您可以使用条件 order by 子句
$organisationsModel->leftJoin('users', function ($join) {
$join->on('organisations.id', '=', 'users.organisationId')
->where( 'users.type', 1)
->where( 'users.deleted', 0 );
})
->select( 'organisations.*', 'users.name as userName' )
->orderByRaw('CASE WHEN users.type = 1 AND users.deleted = 0 THEN 1 ELSE 0 END DESC')
->orderBy( 'userName', 'ASC );
假设我有两个表:用户和组织
users:
id int,
name varchar,
type int,
deleted bool
organisations:
id int,
name varchar
deleted bool
并且我想按类型 1 名称的用户对组织进行排序。我知道当我想按关系值排序时我必须使用 join:
$organisationsModel -> join( 'users', 'organisations.id', '=', 'users.organisationId', 'left' )
-> select( 'organisations.*', 'users.name as userName' )
-> where( 'users.type', 1 )
-> where( 'users.deleted', 0 )
-> orderBy( 'userName', 'ASC );
但它仅显示具有类型 1 用户(已删除设置为 0)的组织,我的问题是:我可以将此查询修改为也 return 值而没有适当的用户连接吗?
您需要一个带有附加连接子句的左连接才能获得所有组织,要对结果进行排序,您可以使用条件 order by 子句
$organisationsModel->leftJoin('users', function ($join) {
$join->on('organisations.id', '=', 'users.organisationId')
->where( 'users.type', 1)
->where( 'users.deleted', 0 );
})
->select( 'organisations.*', 'users.name as userName' )
->orderByRaw('CASE WHEN users.type = 1 AND users.deleted = 0 THEN 1 ELSE 0 END DESC')
->orderBy( 'userName', 'ASC );