首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >拉勒维尔按顺序查询记录?

拉勒维尔按顺序查询记录?
EN

Stack Overflow用户
提问于 2020-04-04 17:34:46
回答 3查看 144关注 0票数 0

我有以下记录,但不知道如何构建正确的查询以获得正确的记录集合:

记录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。

任何关于如何实现这一点的想法,用雄辩的。

我已经开始了,但我不知道下一步该做什么。

代码语言:javascript
运行
复制
Employee::where('employee_id',$employee_record->employee_id)->orderBy('created_at', 'desc')->get();

提前谢谢你,

萨钦

EN

回答 3

Stack Overflow用户

发布于 2020-04-04 18:14:04

首先,您需要获取标题,然后返回像title=“高级”这样的数据集合,并返回记录1、2、4和5,因为您需要顺序搜索,所以您可以用以下方式返回一个查询

代码语言:javascript
运行
复制
$employees = Employee::where("title", Your_title); // this return query

以及搜索日期:

代码语言:javascript
运行
复制
$employees = $employees->orWhere("date", "> or < or ...", your_date);

并且可以使用get来获取搜索到的数据:

代码语言:javascript
运行
复制
return $employees->get();
票数 0
EN

Stack Overflow用户

发布于 2020-04-05 21:38:16

你应该用Laravel内置的集合方法来做。

运行查询后:

代码语言:javascript
运行
复制
$employees = Employee::where('employee_id',$employee_record->employee_id)->orderBy('created_at', 'desc')->get();

$employees将由Laravel返回一个集合(本例中只包括标题列):

代码语言:javascript
运行
复制
[
  {title: "Senior Software Developer"},
  {title: "Senior Software Developer"},
  {title: "Senior Software Developer"},
  {title: "Junior Software Developer"},
  {title: "Senior Software Developer"},
]

首先,我们取第一个元素。我们还需要另一个空集合来选择筛选过的项:

代码语言:javascript
运行
复制
$first = $employees->first();
$filtered = collect([]);

现在,我们迭代并将每个项推到筛选的数组集合中,直到名称更改为止(与$first相比)。

代码语言:javascript
运行
复制
$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)以传递循环回调中的变量。

最后,您将拥有:

代码语言:javascript
运行
复制
[
  {title: "Senior Software Developer"},
  {title: "Senior Software Developer"},
  {title: "Senior Software Developer"},
]

您可以像往常一样使用$filtered对象。

我希望这能帮助你朝着正确的方向前进。一般来说,方法是处理查询结果的正确方法.

文档:https://laravel.com/docs/6.x/collections#method-each

编辑

根据您与我们共享的代码,如果您想要创建此逻辑,您可以在foreach中缩写(不需要在de循环中添加额外的查询数据库)。

代码语言:javascript
运行
复制
// 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_gradeoffice_name对于first元素是相同的,那么将它推到$record_set数组中.当循环不同时,中断循环。

票数 0
EN

Stack Overflow用户

发布于 2020-04-05 22:57:59

感谢上面的帮助。我昨天就做了这件事,看起来很管用。

不确定是否有一种改进/压缩语法的方法,但它有效。

代码语言:javascript
运行
复制
    // 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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61032103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档