如何在 Laravel 的 Eloquent ORM 中按数据透视表数据排序

2023-03-03php开发问题
2

本文介绍了如何在 Laravel 的 Eloquent ORM 中按数据透视表数据排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

在我的数据库中,我有:

In my Database, I have:

  • tops 表格
  • posts 表格
  • tops_has_posts 表格.
  • tops Table
  • posts Table
  • tops_has_posts Table.

当我在 tops 表中检索顶部时,我还会检索与顶部相关的 posts.但是如果我想按特定顺序检索这些帖子怎么办?所以我在我的数据透视表 tops_has_posts 中添加了一个 range 字段,我尝试使用 Eloquent 按结果排序,但它不起作用.

When I retrieve a top on my tops table I also retrieve the posts in relation with the top. But what if I want to retrieve these posts in a certain order ? So I add a range field in my pivot table tops_has_posts and I my trying to order by the result using Eloquent but it doesn't work.

我试试这个:

$top->articles()->whereHas('articles', function($q) {
    $q->orderBy('range', 'ASC');
})->get()->toArray();

还有这个:

$top->articles()->orderBy('range', 'ASC')->get()->toArray();

两者都是绝望的尝试.

提前致谢.

推荐答案

有两种方法 - 一种是指定 table.field,另一种使用 Eloquent 别名 pivot_field if你使用 withPivot('field'):

There are 2 ways - one with specifying the table.field, other using Eloquent alias pivot_field if you use withPivot('field'):

// if you use withPivot
public function articles()
{
  return $this->belongsToMany('Article', 'tops_has_posts')->withPivot('range');
}

// then: (with not whereHas)
$top = Top::with(['articles' => function ($q) {
  $q->orderBy('pivot_range', 'asc');
}])->first(); // or get() or whatever

这会起作用,因为 Eloquent 将 withPivot 中提供的所有字段别名为 pivot_field_name.

This will work, because Eloquent aliases all fields provided in withPivot as pivot_field_name.

现在,通用解决方案:

$top = Top::with(['articles' => function ($q) {
  $q->orderBy('tops_has_posts.range', 'asc');
}])->first(); // or get() or whatever

// or:
$top = Top::first();
$articles = $top->articles()->orderBy('tops_has_posts.range', 'asc')->get();

这将对相关查询进行排序.

This will order the related query.

注意:不要因为这样命名事情而使您的生活变得艰难.posts 不一定是 articles,我会使用一个或另一个名称,除非确实需要这样做.

Note: Don't make your life hard with naming things this way. posts are not necessarily articles, I would use either one or the other name, unless there is really need for this.

这篇关于如何在 Laravel 的 Eloquent ORM 中按数据透视表数据排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

The End

相关推荐

PHP实现DeepL翻译API调用
DeepL的翻译效果还是很强大的,如果我们要用php实现DeepL翻译调用,该怎么办呢?以下是代码示例,希望能够帮到需要的朋友。 在这里需要注意,这个DeepL的账户和api申请比较难,不支持中国大陆申请,需要拥有香港或者海外信用卡才行,没账号的话,目前某宝可以...
2025-08-20 php开发问题
168

PHP通过phpspreadsheet导入Excel日期数据处理方法
PHP通过phpspreadsheet导入Excel日期,导入系统后,全部变为了4开头的几位数字,这是为什么呢?原因很简单,将Excel的时间设置问文本,我们就能看到该日期本来的数值,上图对应的数值为: 要怎么解决呢?进行数据转换就行,这里可以封装方法,或者用第三方的...
2024-10-23 php开发问题
287

mediatemple - 无法使用 codeigniter 发送电子邮件
mediatemple - can#39;t send email using codeigniter(mediatemple - 无法使用 codeigniter 发送电子邮件)...
2024-08-23 php开发问题
11

Laravel Gmail 配置错误
Laravel Gmail Configuration Error(Laravel Gmail 配置错误)...
2024-08-23 php开发问题
16

将 PHPMailer 用于 SMTP 的问题
Problem with using PHPMailer for SMTP(将 PHPMailer 用于 SMTP 的问题)...
2024-08-23 php开发问题
4

关于如何在 GoDaddy 服务器中使用 PHPMailer 设置 SMTP 的问题
Issue on how to setup SMTP using PHPMailer in GoDaddy server(关于如何在 GoDaddy 服务器中使用 PHPMailer 设置 SMTP 的问题)...
2024-08-23 php开发问题
17