Laravel ELOQUENT 问题中的 DISTINCT

Posted

技术标签:

【中文标题】Laravel ELOQUENT 问题中的 DISTINCT【英文标题】:DISTINCT in laravel ELOQUENT issue 【发布时间】:2020-09-12 01:11:13 【问题描述】:

在我的 laravel 应用程序中,我有两个名为 apps 和 app_payments 的表。我想加入这两个表,并按照以下 laravel ELOQUENT 中的说明进行操作。在连接表中,我有一列存储用户 ID (user_id)。以下 ELOQUENT 为特定用户返回多行

$sites=DB::table('app_payments')
        ->join('apps', 'app_payments.app_id', '=', 'apps.appId')
        ->select('app_payments.*', 'apps.*')
        ->where ('apps.appId','=',$id)
        ->get();
return view('payments.show',compact('sites'))
            ->with('i', (request()->input('page', 1) - 1) * 100); 

但我只需要为一个(特定)用户 ID 选择一行,我知道我可能必须在那里使用 DISTINCT,但是在这个 laravel ELOQUENT 中很难使用它。

我怎样才能修改上面的 ELOQUENT 来实现呢?

【问题讨论】:

如果您只需要一个用户,请使用->where('app_payments', '=', $userId)将该条件添加到查询中。 Distinct 不参与其中,因为它仅用于抑制重复的结果。我会假设不会有重复付款。这应该只返回指定用户的付款 【参考方案1】:

您发布的代码使用的是Query Builder (DB::table('app_payments')->...),而不是Eloquent (AppPayment::where(...)->...->get())

您的目标是从这些表格中获得什么?继续直接使用查询构建器还是使用 Eloquent 来扩展查询构建器?

在 Eloquent 中,您可以在模型中的应用和付款之间设置relations:

public function app()

  $this->belongsTo(App::class, 'appId');

public function user()

  $this->belongsTo(User::class);

类似

AppPayment::where('appId', $id)->with(['app', 'user'])->get()

将返回对应应用和用户的所有付款。

当然,如果您希望每个用户只能获得一笔付款,那么这还不能胜任。对我来说,这听起来你最好反过来查询,但这个决定取决于你实际需要什么数据。

对于最后一次付款,如下所示:

// App\Models\User.php
...
public function payments()
  return $this->hasMany(AppPayment::class)
    ->with(['app'])
    ->orderByDesc('created_at');
...

// query anywhere
$users = User::with(['payments', 'payment.app'])
  ->whereHas('payments', function (Builder $query) use($app_id)
    $query->where('app_id', $app_id);
  )
  ->get()

// latest payment:
foreach($users as $user)
  $latestPayment = $user->payments[0];
  ...

虽然代码未经测试...而且它仍然需要一个技巧来仅(!)获得特定应用程序的最新付款,我忘记了这一点...

【讨论】:

这种编码方式效率不高,如果这样编码,laravel 会运行太多查询来获取数据。连接更可取 谢谢!前段时间了解到这一点,并按照 Jonathan Reinink 在 his eloquent course 中指出的方式切换到了 eloquent 范围内的连接。无论哪种方式,您都必须决定是使用 Eloquent 还是 DB。 是的,使用连接比使用 eloquent 关系更有效,您仍然可以坚持使用 eloquent 并在需要时为某些列和内容添加 DB::raw。你提到的文章看起来不错。

以上是关于Laravel ELOQUENT 问题中的 DISTINCT的主要内容,如果未能解决你的问题,请参考以下文章

Laravel ELOQUENT 问题中的 DISTINCT

Laravel Eloquent Where , orWhere 和 Find 在同一个 eloquent 查询中的问题

如何从 Laravel 8 Eloquent 中的嵌套关​​系中获取数据?

Laravel 4 中的 Eloquent 调用:处理多个表中的单个列

通过 eloquent 更新 laravel 中的多行

Laravel Eloquent 搜索表单查询(表单中的多个参数)