Laravel查询构建器`SELECT(x IN(?))AS y`

时间:2018-06-08 11:15:15

标签: laravel query-builder

如何使用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等都是显式方法。< / p>

1 个答案:

答案 0 :(得分:1)

struct A: TextOutputStreamable, LosslessStringConvertible { init?(_ description: String) { } init() { } var description: String { return "foo" } func write<Target>(to target: inout Target) where Target : TextOutputStream { target.write("bar") } } String(describing: A()) // bar String(A()) // foo 在内部使用whereIn()来扩展占位符。

您也可以单独使用它:

Grammar::parameterize()