Laravel Query子查询无法正常工作

时间:2016-12-23 19:55:30

标签: php mysql laravel eloquent

也许我这样做不正确,但我想要做的逻辑是:

我想首先选择包含特定字符串的所有帖子。

然后根据这些结果,我想将其缩小到仅限某个日期内的帖子(Y | m | d)。

所以这就是我现在正在做的事情:

$results = DB::table('posts');

if ($query == null){
  $query = "Posted On: " . $date;
}else {
  $results->where('posts.title', 'LIKE', "%$query%")
          ->orWhere('posts.meta_description', 'LIKE', "%$query%")
          ->orWhere('posts.meta_keywords', 'LIKE', "%$query%")
          ->orWhere('posts.body', 'LIKE', "%$query%")
          ->orWhere('posts.seo_title', 'LIKE', "%$query%");
  $query = $query." / Posted On: " . $date;
}


$results->where(function($query) use ($date){

  $date = explode('-', $date);
  if (!isset($date[1])){
    $query->whereYear('created_at', '=', $date[0]);
  }else if(isset($date[1]) && !isset($date[2])){
    $query->whereYear('created_at', '=', $date[0])
          ->whereMonth('created_at', '=', $date[1]);
  }else if (isset($date[1]) && isset($date[2])){
    $query->whereYear('created_at', '=', $date[0])
          ->whereMonth('created_at', '=', $date[1])
          ->whereDay('created_at', '=', $date[2]);
  }
});

$results = $results->paginate($this->paginate_size());

但是,此查询仍然只返回包含查询字符串的任何内容,并忽略了我想选择仅在特定年/月/日发布的子集的事实。

我错过了什么?

编辑:

使用$ results-> toSql();我得到了查询:

select * from `posts` where `posts`.`title` LIKE ? or 
`posts`.`meta_description` LIKE ? or `posts`.`meta_keywords` LIKE ? or 
`posts`.`body` LIKE ? or `posts`.`seo_title` LIKE ? and year(`created_at`) = ?

然而,它不起作用......

如果我输入例如查询“Lorem”,它将找到所有包含文本Lorem的帖子。

但是,当我添加一个像“2015”这样的特定日期时,它不应该显示2015年的任何帖子与查询Lorem,因为它不存在。

所以这里存在一些逻辑问题。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您不应该需要子查询。

如果您有适当的查询,您应该能够在同一查询中访问。

当然,你可以拥有条件的动态位置,但是在同一个查询中执行。沿线的东西,例如:

if ($query == null){
  $query = "Posted On: " . $date;
}

$results->where('posts.title', 'LIKE', "%$query%")
        ->orWhere('posts.meta_description', 'LIKE', "%$query%")
        ->orWhere('posts.meta_keywords', 'LIKE', "%$query%")
        ->orWhere('posts.body', 'LIKE', "%$query%")
        ->orWhere('posts.seo_title', 'LIKE', "%$query%");

$date = explode('-', $date);
if (!isset($date[1])){
  $results->whereYear('created_at', '=', $date[0]);
}else if(isset($date[1]) && !isset($date[2])){
  $results->whereYear('created_at', '=', $date[0])
          ->whereMonth('created_at', '=', $date[1]);
}else if (isset($date[1]) && isset($date[2])){
  $results->whereYear('created_at', '=', $date[0])
          ->whereMonth('created_at', '=', $date[1])
          ->whereDay('created_at', '=', $date[2]);
}

$results = $results->paginate($this->paginate_size());

答案 1 :(得分:0)

您可以使用whereDate()Eloquent方法:

$results = DB::table('posts');
if ($query == null){
  $query = "Posted On: " . $date;
}else {
  $results->where(function($q) {
        $q->where('posts.title', 'LIKE', "%$query%")
          ->orWhere('posts.meta_description', 'LIKE', "%$query%")
          ->orWhere('posts.meta_keywords', 'LIKE', "%$query%")
          ->orWhere('posts.body', 'LIKE', "%$query%")
          ->orWhere('posts.seo_title', 'LIKE', "%$query%");
  })->whereDate('created_at', '=', date('Y-m-d');
  $query = $query." / Posted On: " . $date;
}
$results = $results->paginate($this->paginate_size());