我有以下记录,但不知道如何构建正确的查询以获得正确的记录集合:
记录1:
创建日期: 05/04/2020;
职称:高级软件开发商;
办公室:纽约
记录2:
创建日期: 03/04/2020;
职称:高级软件开发商;
办公室:纽约
记录3:
创建日期: 01/04/2020;
职称:高级软件开发商;
办公室:纽约
记录4:
创建日期:2020年3月31日;
职称:初级软件开发者;
办公室:纽约
记录5:
创建日期:2020年3月24日;
职称:高级软件开发商;
办事处:东京
我想要创建一个查询,该查询接受最新记录的“标题”,然后依次按日期向后搜索所有记录( upto ),其中的“标题”没有更改。
因此,在上面的示例中,它应该返回Record 1、2和3,但仅此而已。所以,不是记录4或5。
任何关于如何实现这一点的想法,用雄辩的。
我已经开始了,但我不知道下一步该做什么。
Employee::where('employee_id',$employee_record->employee_id)->orderBy('created_at', 'desc')->get();
提前谢谢你,
萨钦
发布于 2020-04-04 18:14:04
首先,您需要获取标题,然后返回像title=“高级”这样的数据集合,并返回记录1、2、4和5,因为您需要顺序搜索,所以您可以用以下方式返回一个查询
$employees = Employee::where("title", Your_title); // this return query
以及搜索日期:
$employees = $employees->orWhere("date", "> or < or ...", your_date);
并且可以使用get来获取搜索到的数据:
return $employees->get();
发布于 2020-04-05 21:38:16
你应该用Laravel内置的集合方法来做。
运行查询后:
$employees = Employee::where('employee_id',$employee_record->employee_id)->orderBy('created_at', 'desc')->get();
$employees
将由Laravel返回一个集合(本例中只包括标题列):
[
{title: "Senior Software Developer"},
{title: "Senior Software Developer"},
{title: "Senior Software Developer"},
{title: "Junior Software Developer"},
{title: "Senior Software Developer"},
]
首先,我们取第一个元素。我们还需要另一个空集合来选择筛选过的项:
$first = $employees->first();
$filtered = collect([]);
现在,我们迭代并将每个项推到筛选的数组集合中,直到名称更改为止(与$first
相比)。
$employees->each(function($item, $key) use($filtered, $first) {
if($item->title != $first->title)
{
// Stops the loop when title changes
return false;
}
// Title hasn't changed.. push
$filtered->push($item);
});
注意use($filtered, $first)
以传递循环回调中的变量。
最后,您将拥有:
[
{title: "Senior Software Developer"},
{title: "Senior Software Developer"},
{title: "Senior Software Developer"},
]
您可以像往常一样使用$filtered对象。
我希望这能帮助你朝着正确的方向前进。一般来说,方法是处理查询结果的正确方法.
文档:https://laravel.com/docs/6.x/collections#method-each
编辑
根据您与我们共享的代码,如果您想要创建此逻辑,您可以在foreach中缩写(不需要在de循环中添加额外的查询数据库)。
// Find all records for this employee
$existing_records = Employee::where([['employee_id', $request->employee_id],['created_at', '<=', $request->created_at]])
->orderBy('created_at', 'desc')
->get();
// Find complete record set for where there has been no change in the Employee's Job Grade, or Office
$record_set = [];
$first = $existing_records->first();
foreach($existing_records as $record) {
if ($record->job_grade == $first->job_grade && $record->office_name == $first->office_name) {
array_push($record_set, $record);
}
else
{
break;
}
}
我认为这样你就能得到同样的数组..。但是有更多的可读性和更少的代码。你认为如何?
在英语中,foreach循环说:如果job_grade
和office_name
对于first
元素是相同的,那么将它推到$record_set
数组中.当循环不同时,中断循环。
发布于 2020-04-05 22:57:59
感谢上面的帮助。我昨天就做了这件事,看起来很管用。
不确定是否有一种改进/压缩语法的方法,但它有效。
// Find all records for this employee
$existing_records = Employee::where([['employee_id', $request->employee_id],['created_at', '<=', $request->created_at]])
->orderBy('created_at', 'desc')
->get();
// Find complete record set for where there has been no change in the Employee's Job Grade, or Office
$record_set[] = $existing_records->first();
foreach($existing_records as $record) {
$previous_record = Employee::where([['employee_id', $record->employee_id], ['created_at', '<', $record->created_at]])
->orderBy('created_at', 'desc')
->first();
if ($previous_record != null) {
$job_grade = $record->job_grade;
$office_name = $record->office_name;
$previous_job_grade = $previous_record->job_grade;
$previous_office_name = $previous_record->office_name;
if ($job_grade == $previous_job_grade && $office_name == $previous_office_name){
array_push($record_set, $previous_record);
}
else {
break;
}
}
else {
break;
}
}
return $record_set;
}
https://stackoverflow.com/questions/61032103
复制相似问题