如何在 laravel / eloquent 中为 mysql 8 做常见的 table 表达式?
How to do common table expressions in laravel / eloquent for mysql 8?
在 laravel 5.7 中执行 CTE 常见 table 表达式的正确方法是什么?
考虑这个 sql:
WITH
SearchTerm AS (
SELECT
ROW_NUMBER() OVER (ORDER BY created_at) AS search_term_order
, jobs.*
FROM jobs
WHERE description LIKE '%programmer%'
),
PremiumAdd AS (
SELECT
ROW_NUMBER() OVER (ORDER BY created_at DESC) AS premium_order
, jobs.*
FROM jobs
WHERE is_premium = 1
),
FinalOrder AS (
SELECT
id
, description
, created_at
, is_premium
, MOD(search_term_order + 1, 2) + FLOOR((search_term_order + 1) / 2) * 3 - 2 AS position
-- , MOD(search_term_order + 2, 3) + FLOOR((search_term_order + 2) / 3) * 4 - 3 AS position
FROM SearchTerm
UNION ALL
SELECT
id
, description
, created_at
, is_premium
, premium_order * 3
-- , premium_order * 4
FROM PremiumAdd
ORDER BY position
)
SELECT
id, description, created_at, is_premium FROM FinalOrder
;
Laravel 不支持 CTE。您可以使用原始查询并自行组合模型:
$rows = DB::select($sql, $bindings);
$jobs = Job::hydrate($rows);
我为常用 table 表达式创建了一个包:https://github.com/staudenmeir/laravel-cte
class Job extends Model
{
// Required in Laravel 5.5–5.7:
// use \Staudenmeir\LaravelCte\Eloquent\QueriesExpressions;
}
$jobs = Job::from('FinalOrder')
->withExpression('SearchTerm', 'SELECT ROW_NUMBER() [...]')
->withExpression('PremiumAdd', 'SELECT ROW_NUMBER() [...]')
->withExpression('FinalOrder', 'SELECT id, description [...]')
->select('id', 'description', 'created_at', 'is_premium')
->get();
在 laravel 5.7 中执行 CTE 常见 table 表达式的正确方法是什么?
考虑这个 sql:
WITH
SearchTerm AS (
SELECT
ROW_NUMBER() OVER (ORDER BY created_at) AS search_term_order
, jobs.*
FROM jobs
WHERE description LIKE '%programmer%'
),
PremiumAdd AS (
SELECT
ROW_NUMBER() OVER (ORDER BY created_at DESC) AS premium_order
, jobs.*
FROM jobs
WHERE is_premium = 1
),
FinalOrder AS (
SELECT
id
, description
, created_at
, is_premium
, MOD(search_term_order + 1, 2) + FLOOR((search_term_order + 1) / 2) * 3 - 2 AS position
-- , MOD(search_term_order + 2, 3) + FLOOR((search_term_order + 2) / 3) * 4 - 3 AS position
FROM SearchTerm
UNION ALL
SELECT
id
, description
, created_at
, is_premium
, premium_order * 3
-- , premium_order * 4
FROM PremiumAdd
ORDER BY position
)
SELECT
id, description, created_at, is_premium FROM FinalOrder
;
Laravel 不支持 CTE。您可以使用原始查询并自行组合模型:
$rows = DB::select($sql, $bindings);
$jobs = Job::hydrate($rows);
我为常用 table 表达式创建了一个包:https://github.com/staudenmeir/laravel-cte
class Job extends Model
{
// Required in Laravel 5.5–5.7:
// use \Staudenmeir\LaravelCte\Eloquent\QueriesExpressions;
}
$jobs = Job::from('FinalOrder')
->withExpression('SearchTerm', 'SELECT ROW_NUMBER() [...]')
->withExpression('PremiumAdd', 'SELECT ROW_NUMBER() [...]')
->withExpression('FinalOrder', 'SELECT id, description [...]')
->select('id', 'description', 'created_at', 'is_premium')
->get();