Php Laravel-从数组中获取最近为各种ID创建的行
我需要一个Laravel查询,返回最近创建的各种Php Laravel-从数组中获取最近为各种ID创建的行,php,arrays,laravel,eloquent,laravel-5.2,Php,Arrays,Laravel,Eloquent,Laravel 5.2,我需要一个Laravel查询,返回最近创建的各种site\u id行。目前,我有一个疑问: Score::whereIn('site_id', $sites)->where('type', 2)->select('score')->get(); 但它会返回所有站点的分数,其中type=2 目前,$sites数组只包含1,2,因此它将排除3和4的站点ID 数据库结构: 查询返回的预期结果将是以下行: 身份证号码:1,2如中所示,它们是数组中最近创建的ID行 更新: 如果我使用
site\u id
行。目前,我有一个疑问:
Score::whereIn('site_id', $sites)->where('type', 2)->select('score')->get();
但它会返回所有站点的分数,其中type=2
目前,$sites
数组只包含1,2
,因此它将排除3和4的站点ID
数据库结构:
查询返回的预期结果将是以下行:
身份证号码:1,2如中所示,它们是数组中最近创建的ID行
更新:
如果我使用:
Score::whereIn('site_id', $sites)->where('type', 2)
->select('score')
->groupBy('site_id')
->get();
一个groupBy
方法,它返回我想要的两个分数,但我不确定为什么它会返回它们?我以为它会根据站点id对所有站点的分数进行分组
谢谢您的帮助。我觉得您只需要一个orderBy(“created_at”)链接到您雄辩的查询末尾。以下是您需要的: 有了它,您可以轻松做到这一点:
$sites = Site::with('latestScore')->find($siteIds); // Collection
// now for each site:
$site->latestScore // what you wanted
但是,如果您希望收集分数,而不是通过网站访问分数,则使用收集方法:
$sites = Site::with('latestScore')->find($siteIds); // Collection
$scores = $sites->pluck('latestScore') // get nested elements from collection
->filter() // filter out null items
感谢您的回复,但orderBy仍将返回与阵列中的这些站点id相关的所有结果,它们将以某种方式进行排序。我不想要所有的结果,我只想要最近创建的结果。那么“最近创建”的截止值是多少?1小时?一天?您可以使用Carbon在有说服力的查询中轻松处理日期。希望这有帮助。没有切断,只是最近为每个网站创建了一个_id!如果站点有10行,请选择最近添加的行。如果阵列中的另一个站点有3行,请选择最近添加的一行。查看可用的收集方法,特别是“唯一”和“筛选”。他们可能会实现你的目标@Ben define last-recent?感谢您的回复,但是,如果我dd($sites),我将返回NULL代码>。在我的站点
模型中,我有以下内容:公共函数latestScore(){return$this->hasOne('App\Score')->latest();}
。但是,如果我执行'dd($siteIds),它会返回1和2(正确的)。使用find([1,2])
会返回一个集合,因此如果您有这样的行,那么它肯定会返回它们。啊,您比我还快;)我手动输入了->find('1')
,这就成功了。我目前正在使用Site::where('trust_id',$trust_id)->select('id')->get()代码>以获取ID。但我不确定为什么这样不行?如果Idd($siteIds)
,它会在集合中显示1和2。因为传递集合(get
)将无法按预期工作。使用Site::where(..)->pull('id')->all()
获取一个数组,稍后可以传递到find()
。然而,在这种情况下,你根本不需要它。只需使用('latestScore')->get()
运行Site::where(…)->,您就可以获得所有信息。它工作得非常好。Jarek,非常感谢你。你又一次拯救了这一天!