Laravel 查询生成器`SELECT (x IN (?)) AS y`

Posted

技术标签:

【中文标题】Laravel 查询生成器`SELECT (x IN (?)) AS y`【英文标题】:Laravel query builder `SELECT (x IN (?)) AS y` 【发布时间】:2018-11-18 10:38:21 【问题描述】:

如何使用 Laravel 的查询构建器进行这种 SELECT:

SELECT *, (sector1 IN (...)) AS s1, (sector2 IN (...)) AS s2, (sector3 IN (...)) AS s3
FROM jobs
WHERE (sector1 IN (1, 2) OR sector3 IN (1, 2) OR sector3 IN (1, 2))
ORDER BY (s1 AND s2 AND s3) DESC, (s1 AND s2) DESC, (s1 AND s3) DESC, etc...

WHERE 部分使用whereIn() 很容易,ORDER 部分使用orderByRaw() 很容易,但是我如何制作SELECT

结果s1s2s3 现在可用于排序:首先如果所有 3 个扇区都匹配,然后如果扇区 1 和 2 匹配,然后如果扇区 1 和 3 匹配,等等。

(...) 是来自用户输入的 1 个或多个扇区。它们必须被转义和插入等,就像WHERE sector1 IN (...) 一样。

但是怎么做呢?

selectRaw 只提供一点帮助,因为它不会将数组扩展为多个占位符。这是我现在拥有的,但不可能是这样:

$query->selectRaw("sector1 IN (" . implode(',', array_fill(0, count($filters['sectors']), '?'))  . ") AS s1", $filters['sectors']);

我必须自己扩展占位符?必须有一种方法可以让查询生成器做到这一点。也许我找不到ConditionExpression?构建器本身似乎没有办法扩展?,只有语法在执行查询时会这样做,这就是为什么whereIn/whereNotIn等都是显式方法的原因。

【问题讨论】:

应该代表什么样的选择语句?通常IN (...) 应该只出现在WHERE 子句中。请在此处发布您的原始 mysql 查询以获得最佳结果。 这正是它应该的样子。你可以在任何地方。你可以选择它,或者 GROUP BY 它,或者 ORDER BY 它,当然还有 WHERE 它。我想选择它,所以我可以订购其中的 3 个。我已更新查询,但对您没有帮助。 【参考方案1】:

whereIn() 在内部使用Grammar::parameterize() 来扩展占位符。

也可以单独使用:

$grammar = new \Illuminate\Database\Query\Grammars\MySqlGrammar();
$query->selectRaw("sector1 IN (" . $grammar->parameterize($filters['sectors'])  . ") AS s1", $filters['sectors']);

【讨论】:

我知道,但这不是 Laravel 的工作方式……我更喜欢我的方式(手动扩展 ?)。但我都不喜欢。我猜是时候进行公关了。

以上是关于Laravel 查询生成器`SELECT (x IN (?)) AS y`的主要内容,如果未能解决你的问题,请参考以下文章

在laravel查询生成器中附加laravel和

如何使用 laravel 5 中的查询生成器从子查询中进行选择

Laravel 查询生成器不在

laravel 查询生成器查询有啥问题?

Laravel 的数据库查询构建器

laravel,查询生成器,(或)查询未按预期工作