雄辩的querybuilder将列传递给嵌套查询

时间:2018-07-02 13:01:37

标签: database eloquent

我想查询数据库以检索在开始日期之后没有创建注释的所有事件。 EVENT和COMMENT的以下结构

EVENT 
id 
start 
created_at 
updated_at

COMMENT
id
comment
event_id
created_at
updated_at

创建一个查询($ query = Event :: query()-> with('comments');),该查询提供了以下结构。

[{
    "id": 1,
    "start": "2018-06-18 12:00:00",
    "created_at": "2018-06-18 11:50:07",
    "updated_at": "2018-07-02 12:13:15",
    "comments": [
        {
            "id": 1,
            "created_at": "2018-06-18 12:44:35",
            "updated_at": "2018-06-18 12:44:35",
            "comment": "cascsac"
        }
    ]
}]

我想检索所有在事件开始日期之后comment.created_at的条目。我尝试了以下方法:

   $query->orWhere(function ($query) {
      $value = $query->where(function ($query) use ('start') {
        $query->whereHas('comments', function ($query) use ('start') {
          $query->where('created_at','<=','start');
          //->whereColumn('created_at', '<=', 'start');
        });
      });
    });

但是它不喜欢我尝试将start传递给嵌套查询,并且不确定如何将它传递给whereColumn查询。

如何将值从列传递到嵌套位置。 或如何使用另外一列的值查询a。

编辑1

应要求提供整个查询

$ query

Event::query()->with('comments');
$query->orWhere(function ($query) {
          $value = $query->where(function ($query) use ('start') {
            $query->whereHas('comments', function ($query) use ('start') {
              $query->where('created_at','>=','start');
              //->whereColumn('created_at', '>=', 'start');
            });
          });
        });
$events = $query->get();

传递变量$ start也可以,但是我无法将start的列值转换为变量$ start来传递嵌套查询

2 个答案:

答案 0 :(得分:0)

错误的代码是'start'>必须是$ start

 $start = Carbon::now()->subYears(100); // for examplee
 $query->orWhere(function ($query) {
     $value = $query->where(function ($query) use ($start) {
         $query->whereHas('comments', function ($query) use ($start) {
              $query->where('created_at','<=', $start);
              //->whereColumn('created_at', '<=', $start);
         });
     });
 })

答案 1 :(得分:0)

https://laracasts.com/discuss/channels/eloquent/querybuilder-pass-column-to-nested-query上回答

$events = Event::with('comments')->whereHas('comments',function ($query) {
   $query->whereColumn('comments.created_at','<','events.start');
})->get();

whereColumn是用于比较查询中的列的函数。