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 中的嵌套关系中获取数据?