使用 where 子句检索数据时是否有检索计数 0 的方法? (Laravel Eloquent)
Is there anyway to retrieve count 0 when retrieve data using where clause? (Laravel Eloquent)
我目前正在使用 group by 检索数据,以获得相同的宝藏名称、找到的总数和相同的宝藏数量(上限)。使用下面的代码,我能够获取所有宝藏数据,但是当宝藏被完全认领时,它无法显示 total_left 是 0.
*claimed 列是一个布尔值,其中 0 尚未被声明。
*cap是同一位置的总宝物
查询
$treasure_hunt_data = TreasureHunt::where('claimed', '0')
->selectRaw(" treasure_name, count(claimed) as total_left, cap")
->groupBy(['treasure_name', 'cap'])
->get();
数据
[
{"treasure_name":"Location A","total_left":5,"cap":5},
{"treasure_name":"Location B","total_left":2,"cap":2},
{"treasure_name":"Location C","total_left":2,"cap":2},
{"treasure_name":"Location D","total_left":10,"cap":10}
]
所需数据
[
{"treasure_name":"Location A","total_left":5,"cap":5},
{"treasure_name":"Location B","total_left":2,"cap":2},
{"treasure_name":"Location C","total_left":2,"cap":2},
{"treasure_name":"Location D","total_left":10,"cap":10},
{"treasure_name":"Location E","total_left":0,"cap":1}
]
数据库数据
迁移详细信息
Schema::create('treasure_hunts', function (Blueprint $table) {
$table->id();
$table->string('treasure_name');
$table->boolean('claimed')->default(0);
$table->string('cap');
$table->timestamps();
});
您可以使用 CTE(通用 Table 表达式)和 DB::select
语句来执行此操作。例如:
$treasure_hunt_data = DB::select("
with treasure_data as (
select treasure_name, count(claimed) as total_left, cap
from treasure_hunt
where claimed = 0
group by treasure_name, cap
)
select * from treasure_data where total_left = 0
");
将return结果集作为数组
DB中实际记录如下:
[{"id":1,"treasure_name":"Location A","claimed":1,"cap":"10","created_at":null,"updated_at":null},
{"id":2,"treasure_name":"Location B","claimed":1,"cap":"220","created_at":null,"updated_at":null},
{"id":3,"treasure_name":"Location C","claimed":1,"cap":"42","created_at":null,"updated_at":null},
{"id":4,"treasure_name":"Location D","claimed":0,"cap":"23","created_at":null,"updated_at":null},
{"id":5,"treasure_name":"Location A","claimed":1,"cap":"233","created_at":null,"updated_at":null}]
尝试此查询检索数据:
$treasure_hunt_data = TreasureHunt::select(
'treasure_name',
\DB::raw('sum(case when claimed = 1 then 1 else 0 end) as total_left'),
\DB::raw('sum(cap) as cap')
)
->groupBy('treasure_name')
->get();
以下是上述查询的结果:
[{"treasure_name":"Location A","total_left":"2","cap":243},
{"treasure_name":"Location B","total_left":"1","cap":220},
{"treasure_name":"Location C","total_left":"1","cap":42},
{"treasure_name":"Location D","total_left":"0","cap":23}]
我目前正在使用 group by 检索数据,以获得相同的宝藏名称、找到的总数和相同的宝藏数量(上限)。使用下面的代码,我能够获取所有宝藏数据,但是当宝藏被完全认领时,它无法显示 total_left 是 0.
*claimed 列是一个布尔值,其中 0 尚未被声明。 *cap是同一位置的总宝物
查询
$treasure_hunt_data = TreasureHunt::where('claimed', '0')
->selectRaw(" treasure_name, count(claimed) as total_left, cap")
->groupBy(['treasure_name', 'cap'])
->get();
数据
[
{"treasure_name":"Location A","total_left":5,"cap":5},
{"treasure_name":"Location B","total_left":2,"cap":2},
{"treasure_name":"Location C","total_left":2,"cap":2},
{"treasure_name":"Location D","total_left":10,"cap":10}
]
所需数据
[
{"treasure_name":"Location A","total_left":5,"cap":5},
{"treasure_name":"Location B","total_left":2,"cap":2},
{"treasure_name":"Location C","total_left":2,"cap":2},
{"treasure_name":"Location D","total_left":10,"cap":10},
{"treasure_name":"Location E","total_left":0,"cap":1}
]
数据库数据
迁移详细信息
Schema::create('treasure_hunts', function (Blueprint $table) {
$table->id();
$table->string('treasure_name');
$table->boolean('claimed')->default(0);
$table->string('cap');
$table->timestamps();
});
您可以使用 CTE(通用 Table 表达式)和 DB::select
语句来执行此操作。例如:
$treasure_hunt_data = DB::select("
with treasure_data as (
select treasure_name, count(claimed) as total_left, cap
from treasure_hunt
where claimed = 0
group by treasure_name, cap
)
select * from treasure_data where total_left = 0
");
将return结果集作为数组
DB中实际记录如下:
[{"id":1,"treasure_name":"Location A","claimed":1,"cap":"10","created_at":null,"updated_at":null},
{"id":2,"treasure_name":"Location B","claimed":1,"cap":"220","created_at":null,"updated_at":null},
{"id":3,"treasure_name":"Location C","claimed":1,"cap":"42","created_at":null,"updated_at":null},
{"id":4,"treasure_name":"Location D","claimed":0,"cap":"23","created_at":null,"updated_at":null},
{"id":5,"treasure_name":"Location A","claimed":1,"cap":"233","created_at":null,"updated_at":null}]
尝试此查询检索数据:
$treasure_hunt_data = TreasureHunt::select(
'treasure_name',
\DB::raw('sum(case when claimed = 1 then 1 else 0 end) as total_left'),
\DB::raw('sum(cap) as cap')
)
->groupBy('treasure_name')
->get();
以下是上述查询的结果:
[{"treasure_name":"Location A","total_left":"2","cap":243},
{"treasure_name":"Location B","total_left":"1","cap":220},
{"treasure_name":"Location C","total_left":"1","cap":42},
{"treasure_name":"Location D","total_left":"0","cap":23}]