Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Laravel-如何将包含串联查询的派生表转换为雄辩的语法?_Mysql_Sql_Laravel - Fatal编程技术网

Mysql 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

如何将以下内容转换为雄辩的语法?我知道其中有一个派生表,所以不确定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 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文件中得到记录。