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