Mysql Laravel-如何将包含串联查询的派生表转换为雄辩的语法?
如何将以下内容转换为雄辩的语法?我知道其中有一个派生表,所以不确定Laravel中的正确语法是什么Mysql Laravel-如何将包含串联查询的派生表转换为雄辩的语法?,mysql,sql,laravel,Mysql,Sql,Laravel,如何将以下内容转换为雄辩的语法?我知道其中有一个派生表,所以不确定Laravel中的正确语法是什么 SELECT firstname , CONCAT_WS ( ', ' , CASE WHEN years = 0 THEN NULL ELSE CONCAT(years,' years') END , CASE WHEN months = 0 THEN NULL ELSE CONCAT(months, ' months') END , CASE WHEN days = 0 THEN NU
SELECT firstname
, CONCAT_WS
( ', '
, CASE WHEN years = 0 THEN NULL ELSE CONCAT(years,' years') END
, CASE WHEN months = 0 THEN NULL ELSE CONCAT(months, ' months') END
, CASE WHEN days = 0 THEN NULL ELSE CONCAT(days, ' days') END
) lengthOfService
FROM
( SELECT firstname
, FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425) years
, FLOOR((DATEDIFF(CURDATE(),startdate)/365.2425 - FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425))* 12) months
, CEILING((((DATEDIFF(CURDATE(),startdate)/365.2425 - FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425))* 12)
- FLOOR((DATEDIFF(CURDATE(),startdate)/365.2425 - FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425))* 12))* 30) days
FROM users
) x
雄辩并没有提供这样的具体方法。您需要使用
DB::raw(“…”)
(但我想这不是一个解决方案),或者DB::select(“select…”)代码>雄辩不提供此类具体方法。您需要使用DB::raw(“…”)
(但我想这不是一个解决方案),或者DB::select(“select…”)代码>Laravel确实提供了水合作用
首先制作一个模型类,我将使用App\Models\myeduser
$query = "SELECT firstname, CONCAT_WS ( ', '
, CASE WHEN years = 0 THEN NULL ELSE CONCAT(years,' years') END
, CASE WHEN months = 0 THEN NULL ELSE CONCAT(months, ' months') END
, CASE WHEN days = 0 THEN NULL ELSE CONCAT(days, ' days') END
) lengthOfService
FROM
( SELECT firstname
, FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425) years
, FLOOR((DATEDIFF(CURDATE(),startdate)/365.2425 -
FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425))* 12) months
, CEILING((((DATEDIFF(CURDATE(),startdate)/365.2425 -
FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425))* 12)
- FLOOR((DATEDIFF(CURDATE(),startdate)/365.2425 -
FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425))* 12))* 30) days
FROM users
) x";
$users = App\Models\HydratedUser::hydrateRaw($query);
$users变量将保存一组水合器型号Laravel确实提供水合器
首先制作一个模型类,我将使用App\Models\myeduser
$query = "SELECT firstname, CONCAT_WS ( ', '
, CASE WHEN years = 0 THEN NULL ELSE CONCAT(years,' years') END
, CASE WHEN months = 0 THEN NULL ELSE CONCAT(months, ' months') END
, CASE WHEN days = 0 THEN NULL ELSE CONCAT(days, ' days') END
) lengthOfService
FROM
( SELECT firstname
, FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425) years
, FLOOR((DATEDIFF(CURDATE(),startdate)/365.2425 -
FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425))* 12) months
, CEILING((((DATEDIFF(CURDATE(),startdate)/365.2425 -
FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425))* 12)
- FLOOR((DATEDIFF(CURDATE(),startdate)/365.2425 -
FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425))* 12))* 30) days
FROM users
) x";
$users = App\Models\HydratedUser::hydrateRaw($query);
$users变量将保存一组HYTHADEDUSER模型,而无需借助查询生成器进行雄辩
使用DB::raw
和selectRaw()方法创建子查询并使用DB::table
$subQuery = DB::table('users')
->selectRaw('firstname,
FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425) years,
FLOOR((DATEDIFF(CURDATE(),startdate)/365.2425 -
FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425))* 12) months,
CEILING((((DATEDIFF(CURDATE(),startdate)/365.2425 -
FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425))* 12) -
FLOOR((DATEDIFF(CURDATE(),startdate)/365.2425 -
FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425))* 12))* 30) days');
DB::table(DB::raw('('.$subQuery->toSql().') as tableName')
->selectRaw("firstname, CONCAT_WS(', ',
CASE WHEN years = 0 THEN NULL ELSE CONCAT(years,' years') END,
CASE WHEN months = 0 THEN NULL ELSE CONCAT(months, ' months') END,
CASE WHEN days = 0 THEN NULL ELSE CONCAT(days, ' days') END) lengthOfService")
没有查询生成器的雄辩
使用DB::raw
和selectRaw()方法创建子查询并使用DB::table
$subQuery = DB::table('users')
->selectRaw('firstname,
FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425) years,
FLOOR((DATEDIFF(CURDATE(),startdate)/365.2425 -
FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425))* 12) months,
CEILING((((DATEDIFF(CURDATE(),startdate)/365.2425 -
FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425))* 12) -
FLOOR((DATEDIFF(CURDATE(),startdate)/365.2425 -
FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425))* 12))* 30) days');
DB::table(DB::raw('('.$subQuery->toSql().') as tableName')
->selectRaw("firstname, CONCAT_WS(', ',
CASE WHEN years = 0 THEN NULL ELSE CONCAT(years,' years') END,
CASE WHEN months = 0 THEN NULL ELSE CONCAT(months, ' months') END,
CASE WHEN days = 0 THEN NULL ELSE CONCAT(days, ' days') END) lengthOfService")
Eloquent是一种ORM,它将物理关系表转换为对象。我认为它不适用于派生表。但是,您可以在users表中添加一个作用域以向下过滤到该派生表。@apokryfos理论上我可以将其包装到DB::raw()
中吗?可以,但这并不是真正使用Eloquent,只是使用查询生成器。如果有帮助(如果您有用户模型,您可以对其进行作用域),可以使用Hyderaw。但它并没有被记录:Elount是一种ORM,它将物理关系表转换为对象。我认为它不适用于派生表。但是,您可以在users表中添加一个作用域以向下过滤到该派生表。@apokryfos理论上我可以将其包装到DB::raw()
中吗?可以,但这并不是真正使用Eloquent,只是使用查询生成器。如果有帮助(如果您有用户模型,您可以对其进行作用域),可以使用Hyderaw。不过,它没有被记录在案:谢谢。这很有效。我希望这个方法能在官方的Laravel文档中记录下来。谢谢。这很有效。我希望这一方法能在官方的Laravel文件中得到记录。