Laravel:跨关系定义表的查询

Laravel:跨关系定义表的查询,laravel,Laravel,我有$provider,这是provider模型 此外,我还有与捐赠者相关的Log,如捐赠者模型中的此关系所定义: public function Log(){ return $this->hasMany(Log::class,'DonorID','DonorID'); } $donor->load('Log')将返回以下信息,该信息包含与之关联的所有日志 { "DonorID": "59060001", "DonorCitizenID": "1000000000009"

我有
$provider
,这是
provider
模型

此外,我还有与捐赠者相关的
Log
,如
捐赠者
模型中的此关系所定义:

public function Log(){
    return $this->hasMany(Log::class,'DonorID','DonorID');
}
$donor->load('Log')
将返回以下信息,该信息包含与之关联的所有
日志

{
  "DonorID": "59060001",
  "DonorCitizenID": "1000000000009",
  "DonorPrefix": "Mx.",
  "DonorName": "John",
  "DonorSurname": "Smith",
  "created_at": "2016-06-21 08:06:44.000",
  "updated_at": "2016-06-23 02:15:10.000",
  "log": [
    {
    "LogID": 6,
    "DonorID": "59060001",
    "EventTypeID": "1",
    "EventDate": "2016-06-15",
    "EventBrief": "Donor Added",
    "created_at": "2016-06-15 06:01:06.000",
    "updated_at": "2016-06-15 06:01:06.000"
    },
    {
    "LogID": 21,
    "DonorID": "59060001",
    "EventTypeID": "2",
    "EventDate": "2016-06-23",
    "EventBrief": "Donor has rested in peace.",
    "created_at": "2016-06-23 02:30:49.000",
    "updated_at": "2016-06-23 02:30:49.000"
    }
  ]
}
现在,我有了这个查询代码,它从字段中获取输入的文本,找到特定的
捐赠者
,并返回它

  $donors = Donor::
    where('DonorCitizenID', 'LIKE', '%'.Input::get('DonorCitizenID').'%')->
    where('DonorName', 'LIKE', '%'.Input::get('DonorName').'%')->
    where('DonorSurname', 'LIKE', '%'.Input::get('DonorSurname').'%')->
    get();
它按照它所说的那样做,获取所有
捐赠者
s,前提是它符合多个标准,并且只要我匹配的数据存储在
捐赠者
中,它就工作得很好

但是,我需要另一个搜索字段。这个将通过匹配加载的
日志中的
事件类型ID
来匹配任何捐赠者中最新的
(因为一个
捐赠者可以有许多
日志
)。我如何编写执行此操作的条件


请注意,返回的值应该是所有符合条件的
捐赠者的列表。

如果我理解你的意思,应该这样做

编辑

$donors = Donor::
        where('DonorCitizenID', 'LIKE', '%'.Input::get('DonorCitizenID').'%')
      ->where('DonorName', 'LIKE', '%'.Input::get('DonorName').'%')
      ->where('DonorSurname', 'LIKE', '%'.Input::get('DonorSurname').'%')
      ->with(['Log' => function ($query) {  
         $query->where('EventType', 'LIKE', '%'.Input::get('EventType').'%')->get();
    }])->get();


$donor->Log // result
使用
whereHas


查看您的查询,我认为它应该返回一个
捐赠者集合
,而不仅仅是一个
捐赠者
。是的,捐赠者集合。感谢您的帮助!但是,只返回最新的
日志
不是我想要的。我想检查
捐赠者所拥有的
日志
中的特定字段,如果它与该字段匹配,则返回
捐赠者
,与我的其他查询匹配
DonorName
DonorSurname
,等等的行为相同。类似于
->where(Log->'EventType','like','%'。Input::get('DonorSurname')。%')
哦,忘记编辑
输入
。在本例中,它是
Input::get('EventType')
;对于
EventType
文本框。只需将orderby更改为
->where('EventType','LIKE','%')。Input::get('EventType')。%')
也可以
->has
而不是
->with
并使用上面提到的方法。如果检查编辑,它将为您提供带有日志的donnor。谢谢,但是,它不能按预期工作
Log
只为第一个结果而急切地加载到捐赠者的
Log
,而不是其他结果。此外,添加的查询仍然加载其最新的
Log
Input::get('EventType')
不匹配的
provider
,这几乎成功了!但是,我只想查询
捐赠者
的最新
日志
事件类型
。以下代码仍然返回可能具有上一日志中指定的
EventType
s,这是不需要的。
$donors = Donor::
        where('DonorCitizenID', 'LIKE', '%'.Input::get('DonorCitizenID').'%')
      ->where('DonorName', 'LIKE', '%'.Input::get('DonorName').'%')
      ->where('DonorSurname', 'LIKE', '%'.Input::get('DonorSurname').'%')
      ->whereHas('Log', function ($query) {  
            $query->where('EventType', 'LIKE', '%'.Input::get('EventType').'%');
        })->get();