【发布时间】:2020-02-01 15:10:41
【问题描述】:
我有一个 SQL 查询,我将列转换为 SIGNED 以将其与整数进行比较。我的表“行星”如下所示
id | name | galaxy | region
1 | S1 | 00 | 01
2 | S2 | 00 | 01
3 | S3 | 00 | 02
4 | S4 | 01 | 00
5 | S5 | 00 | 00
有数百个条目属于不同的星系 (0-99) 和区域 (0-99)
galaxy 和 region 列设置为字符串,以使用前导 0 存储它们。也许不是最好的方法,但我就是这样做的。
我有一个变量如下
$planet = Planet::where('galaxy', '00')->get();
然后我有下面的循环来带出属于 00 星系和定义区域的行星,循环穿过每个可能的区域 (0 - 99) 并打印计数。
$count = 0;
while($count < 100){
echo $planet->whereRaw('CAST(region as SIGNED) = '.$count)->count();
$count++;
}
问题是,第一次交互(其中 $count 等于 0)返回结果,但任何后续循环都不会返回任何内容。如果我将 $count 设置为不同的值,则相同的故事 - 第一个循环有效,但以下循环均无效。
非常感谢任何关于为什么会出现这种情况的想法。我在循环中回显了 $count 以仔细检查它肯定会按顺序打印 0 到 99 之间的数字,而且确实如此,所以不确定为什么它没有在 SQL 查询中返回第一个以外的结果。
编辑:我想要达到的目标如下图所示:
基本上有成千上万的行星,每一个都在一个星系和一个区域中。星系编号 00-99 和区域。
我将转到/map/00 的网址,告诉我我正在查看哪个星系,然后会有上面 10 x 10 的网格,每个部分都包含该星系该区域中行星的数量。每个网格都是在 while 循环中创建的 div。
所以实际的 while 循环如下所示:
$count = 0;
while($count < 100){
echo "<div class="inline-flex w-1/10">
echo $planet->whereRaw('CAST(region as SIGNED) = '.$count)->count();
echo "</div>
$count++;
}
计数已到位,因此我们知道我们在网格的哪个部分,因此过滤 $astros->whereRaw 查询以专注于该区域。因为实际表是字符串而不是整数,所以我需要将 is 作为 SIGNED 字段进行转换,以便 where 查询起作用。所以我实际追求的SQL查询如下:
SELECT * FROM planets WHERE galaxy = 00 AND CAST(region as SIGNED) = $count
【问题讨论】:
-
欢迎@Jake!什么
$astros? -
对不起,astros 实际上是 $planet 所以这就是我之前提到的查询 $planet = Planet::where('galaxy','00')->get();只是一个错字,对不起!已更正。
标签: php sql laravel while-loop casting