您不能在通配符查询中使用 between。您也许可以编写一个正则表达式来匹配您需要的内容,例如:
select * from `server_details` where `HDD` regexp '1[2-9]\dGB|[2-9]\d\dGB|\dTB|10TB'
但正如您所看到的,这是一个非常具体的表达式,基于您所写的内容,每个不同的限制都需要不同的表达式。
有一些 python 代码可以生成这样的表达式,但我找不到 PHP 代码(通过一些非常基本的谷歌搜索)
另一种解决方案(也是我个人推荐的)是将容量添加为单独的列:
迁移当前表:
class AddCapacityColumnMigration extends Migration {
public function up()
{
Schema::table('computers', function (Blueprint $table) {
$table->bigInt('capacityMB')->nullable();
});
Computer::chunk(100, function ($computers) {
foreach ($computers as $computer) {
if (preg_match('/(\d+)x(\d+)(M|G|T)B/',$computer->HDD,$m) {
$capacity = $m[1];
$capacity *= $m[3] === 'M' ? 1 : ($m[3] === 'G' ? 1000 : 1000000 );
$computer->capacityMB = $capacity * $m[2];
$computer->save();
}
}
});
}
然后,您可能希望在模型中添加一个creating
和updating
事件,以确保您始终设置新的 capacityMB 列。完成所有这些后,您的查询就很简单了:
select * from `server_details` where `capacityMB` between 120000 and 10000000