【问题标题】:Laravel Eloquent: how to get related records via whereHas() method?Laravel Eloquent:如何通过 whereHas() 方法获取相关记录?
【发布时间】: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 字段类型
  • 有什么意义?你想达到什么目标?
  • 例如,我想获取具体日期的所有帖子,这是为具体用户定义的。

标签: laravel eloquent


【解决方案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 外观的依赖注入的情况下使用。

【讨论】:

    猜你喜欢
    • 2014-09-30
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 2021-05-25
    相关资源
    最近更新 更多