目前在我的一个控制器中,我有以下查询:
$maintenances = DB::table("equipment_attachments")
->select(DB::raw('year(date) as year'), DB::raw("COUNT(*) as count"))
->where('attachmentCategory','Maintenance')
->orderBy(DB::raw("year(date)"))
->groupBy(DB::raw("year(date)"))
->get();
这项工作正常,但我想更进一步过滤,我相信我知道如何通过模型来做到这一点,但不太确定使用数据库功能。
我希望能够使用另一个名为equipment
的表,并使用名为type
的字段过滤到类型仅为3的字段。
所以基本上我想从上面的内容中过滤掉,然后继续使用表equipment_attachments
中的字段equipment_attachments.unitID
中引用的设备等于{{{ 1}} equipment
字段等于3。
答案 0 :(得分:1)
您只需添加join
并使用where
子句即可。你的最终查询看起来像这样。
DB::table("equipment_attachments")
->join('equipments', 'equipments.id' , '=', 'equipment_attachments.unitID'
->select(DB::raw('year(date) as year'), DB::raw("COUNT(*) as count"))
->where('attachmentCategory','Maintenance')
->where('equipments.type', 3)
->orderBy(DB::raw("year(date)"))
->groupBy(DB::raw("year(date)"))
->get();
您也可以使用selectRaw
选择使用SQL函数。
DB::table("equipment_attachments")
->join('equipments', 'equipments.id' , '=', 'equipment_attachments.unitID'
->selectRaw("year(date) as year, COUNT(*) as count")
->where('attachmentCategory','Maintenance')
->where('equipments.type', 3)
->orderBy(DB::raw("year(date)"))
->groupBy(DB::raw("year(date)"))
->get();
答案 1 :(得分:0)
你有两种选择;
$equipment = DB::table('equipment_attachments')
->join('equipment', 'equipment.id', '=', 'equipment_attachments.equipment_id')
->where('type', 3)
->select('equipment_attachments.*')
->get();
EquipmentAttachment::whereHas('equipment', function($query) {
$query->where('type', 3);
})->all();
就个人而言,我会考虑使用ORM技术上你不需要做任何原始SQL,这意味着如果你愿意,你可以更容易地交换DB语言。我不确定你的数据库中的日期格式,但如果它是一个时间戳你可以在ORM中实现相同的;
EquipmentAttachment::where('date', (new DateTime())->format('Y')->all();
最后,如果您使用first(),get()或all(),您可以将 - > toSql()和SQL语句放在一起,例如;
echo EquipmentAttachment::where('date', '2018-06-14')->toSql();
dd();
希望有所帮助。