【问题标题】:Filter search results based on data of a relationship in a model根据模型中的关系数据过滤搜索结果
【发布时间】:2018-05-12 19:16:48
【问题描述】:

在这种情况下,我有 Patients ModelReports Model。患者有很多报告。

<?php

namespace App;  
use Illuminate\Foundation\Auth\User as Authenticatable;
use DB;
use Spatie\Permission\Traits\HasRoles;

class Patient extends Authenticatable
{
    public function reports()
    {
        return $this->hasMany('App\Reports');
    }
}

在一个视图中,我有一份所有患者的列表,其中包含针对他们的报告 ID。我们有一个搜索患者模块,我们可以在其中使用 Patient idReport id 搜索 Patient。我能够满足使用

搜索 Patient id

$data = Patient::where("id", "LIKE", "%{$search_patient}%")

但无法解决根据报告ID搜索患者和过滤结果的场景,因为报告的数据是使用hasMany关系检索的

下面是结果,其中 Patient 数据来自 Patient 模型,而 Reports 数据来自 Reports 模型,使用 hasMany 关系。我的要求是当我使用报告 ID 进行搜索时,我应该只能看到具有该报告 ID 的数据和用户信息。

[
  {
    "id": 1,
    "group_id": 1000,
    "date": "01-01-14",
    "name": "Voss",
    "address": "My Home 1",
    "reports": [
      {
        "id": "ABC123",
        "name": "Report1"
      },
      {
        "id": "EDC123",
        "name": "Report2"
      }
    ]
  },
  {
    "id": 2,
    "group_id": 1000,
    "date": "01-01-15",
    "name": "Rosalia",
    "address": "My Home 2",
    "reports": [
      {
        "id": "RTC123",
        "name": "Report3"
      },
      {
        "id": "TYH123",
        "name": "Report4"
      }
    ]
  }
]

【问题讨论】:

  • 报告是否属于患者?在这种情况下,您必须定义一个 belongsTo 关系而不是 hasMany。当您尝试从患者那里检索报告时,您会遇到什么错误?
  • 每位患者都有多个报告。我正在针对每条记录显示患者列表和报告 ID。现在如何根据报告 ID 搜索患者。你能再读一遍这个问题吗?
  • 不,我明白了这个问题,但您没有显示与患者关系的报告模型。如果我阅读您的问题,我认为一份报告可以有多个患者,这似乎不太可能。这就是为什么我试图确定您的报告患者关系应该是什么。
  • 好的...我的每个报告都与一个用户相关联。你有解决方案的 cmet 吗?

标签: laravel laravel-5 laravel-5.2 relationships


【解决方案1】:

像这样向您的 Report 模型添加 belongsTo 关系:

public function patient() {
    return $this->belongsTo("App\Models\Patient", "patient_id", "id");
}

然后在您的报告模型中执行搜索

$data = Report::with('patient')->where('id', $report_id)->get();

结果应该是这样的

...
{
  "id": ABC123,
  "name": Report 1,
  "patient": {
    "id": 2,
    "group_id": 1000,
    "date": "01-01-15",
    "name": "Rosalia",
    "address": "My Home 2",
  }
},
...

编辑: 如果您坚持以您的患者为基础,请执行以下操作:

 Patient::whereHas('reports', function ($query) use($report_id) {
     $query->where('id', $report_id);
 })->with(['reports' => function ($query) use($report_id) {
     $query->where('id', $report_id);
 }])->get();
  1. whereHas 将执行搜索
  2. with 将只加载您指定的报告 ID

【讨论】:

  • 我需要作为父母的患者信息和作为​​孩子的报告。每个患者都有多个报告。我正在针对每条记录显示患者列表和报告 ID。现在如何根据报告 ID 搜索患者。你能再读一遍这个问题吗?
  • 我已根据您的需要编辑了我的答案。请参阅下面的更改。
【解决方案2】:

首先在您的报告模型中添加一个 belongsTo:

public function patient()
{
    return $this->belongsTo(Patient::class);
}

然后像这样检索它:

$reportId = "ABC123"; //for demo purposses, you get this dynamically

$record = Report::where('record_id', '=', $reportId)->first();
    // i used record_id, but you probably have just id;

$patient = $record->patient()->with('records')->first();

dd($patient);

结果是这样的:

Patient {#199 ▼
  #guarded: []
  #connection: "mysql"
  #table: null
  #primaryKey: "id"
  #keyType: "int"
  +incrementing: true
  #with: []
  #withCount: []
  #perPage: 15
  +exists: true
  +wasRecentlyCreated: false
  #attributes: array:5 [▼
    "id" => 1
    "group_id" => 1000
    "date": "01-01-15"
    "name" => "Rosalia"
    "created_at" => null
    "updated_at" => null
  ]
  #original: array:5 [▶]
  #changes: []
  #casts: []
  #dates: []
  #dateFormat: null
  #appends: []
  #dispatchesEvents: []
  #observables: []
  #relations: array:1 [▼
    "reports" => Collection {#204 ▼
      #items: array:2 [▼
        0 => Report {#207 ▶}
        1 => Report {#209 ▶}
      ]
    }
  ]
  #touches: []
  +timestamps: true
  #hidden: []
  #visible: []
  #fillable: []

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 2021-11-06
    • 2015-02-09
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    相关资源
    最近更新 更多