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 集合中?

如何使用 Laravel 4 Eloquent 连接列?

Laravel / Eloquent - 如何同时运行多个原始SQL语句?

如何在 Laravel 中使用 eloquent 执行多表选择