从另一个表中过滤的Laravel数据库查询

时间:2018-06-14 13:54:47

标签: laravel laravel-5 eloquent

目前在我的一个控制器中,我有以下查询:

$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。

2 个答案:

答案 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)

你有两种选择;

  1. 如果您正在使用查询构建器,即DB :: query(),那么您将需要加入相关表并以这种方式应用where子句。
  2. Query Builder

        $equipment = DB::table('equipment_attachments')
                ->join('equipment', 'equipment.id', '=', 'equipment_attachments.equipment_id')
                ->where('type', 3)
                ->select('equipment_attachments.*')
                ->get();
    
    1. 如果您正在使用雄辩的ORM,那么您可以使用whereHas()语句,但您需要首先在模型中定义关系。
    2. Eloquent Relationships

          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();
      

      希望有所帮助。