Laravel Eloquent:如何通过 whereHas() 方法获取相关记录?
Posted
技术标签:
【中文标题】Laravel Eloquent:如何通过 whereHas() 方法获取相关记录?【英文标题】:Laravel Eloquent: how to get related records via whereHas() method? 【发布时间】:2017-05-15 04:27:01 【问题描述】:例如,我可以检查每个带有具体日期的帖子。
$users = User::whereHas('posts', function($q)
$q->where('created_at', '>=', '2015-01-01 00:00:00');
)->get();
但是假设,如果我想将后模型日期(created_at)与用户模型的日期属性进行比较,该怎么办?
例如:
$users = User::whereHas('posts', function($q)
$q->where('created_at', '>=', ** $user->customDate ** ← look this);
)->get();
更新。 我在 Laravel 之外使用 Eloquent。
【问题讨论】:
customDate 是用户表中的字段吗? 是的,mysql DATE 字段类型 有什么意义?你想达到什么目标? 例如,我想获取具体日期的所有帖子,这是为具体用户定义的。 【参考方案1】:假设您的 users 表被称为 users
,您可以使用 DB::raw()
来引用一个值,就像在普通查询中一样:
$users = User::whereHas('posts', function($q)
$q->where('created_at', '>=', DB::raw('users.customDate'));
)->get();
不要忘记导入 DB
外观或将其更改为 \DB::raw(...)
。
如果你在 Laravel 之外使用它并且没有门面,你可以去掉中间人并做:
$q->where('created_at', '>=', new Illuminate\Database\Query\Expression(('users.customDate'));
希望这会有所帮助!
【讨论】:
嗯,您的方法在这种情况下是否有效? ScheduledEvent::find(1)->orders->where('dateFrom','=', ORDER_CUSTOM_DATE); @Stanislav 什么?!? 这是一个类似的任务,需要在where条件下通过具体的order.customDate从相关订单表中获取记录。 我有一个问题 - 我在 Laravel 之外使用 Eloquent,并且没有外观和数据库管理器的 raw() 方法。也许您知道其他解决方案? 很抱歉。当你用Laravel
标记问题时,我假设你使用的是 laravel。我假设你有整个 Illuminate\Database
包?【参考方案2】:
您可以在 Eloquent 子查询中使用 原始表达式,方法是使用 $q->whereRaw
。
在你的例子中:
$users = User::whereHas('posts', function($q)
$q->whereRaw("created_at >= users.customDate");
)->get();
与 DB::raw
不同,这可以在没有 Laravel 的 Illuminate\Database
外观的依赖注入的情况下使用。
【讨论】:
以上是关于Laravel Eloquent:如何通过 whereHas() 方法获取相关记录?的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Eloquent:如何通过 whereHas() 方法获取相关记录?
如何通过分页获取 Laravel Eloquent 中的特定列?
如何通过索引将项目添加到 Laravel Eloquent 集合中?