【问题标题】:Laravel Query with subquery not working带有子查询的 Laravel 查询不起作用
【发布时间】:2017-05-09 11:57:21
【问题描述】:

也许我做错了,但是我想在逻辑上做的是:

我想先选择所有包含某个字符串的帖子。

然后从这些结果中,我想将其缩小到仅在特定日期 (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 的帖子,因为它不存在。

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

【问题讨论】:

  • 能否请您显示 laravel 执行的查询(使用 ->toSql() )
  • 您应该将$results 设置为where 函数返回的值。所以$results = $results->where(...
  • 我得到的查询是:
  • 我得到的查询是:select * from posts` 其中posts.title LIKE ?或posts.meta_description 喜欢?或posts.meta_keywords 喜欢?或posts.body 喜欢?或posts.seo_title 喜欢?和年份(created_at)=? `
  • 问题是查询完全忽略了“日期”——所以我搜索“Lorem”,它会找到 2 个带有 Lorem 文本的帖子,但如果我指定日期为 2015 年,它应该找到 0 个帖子,因为 2015 年没有包含文本“lorem”的帖子

标签: php mysql laravel eloquent


【解决方案1】:

您不应该需要子查询。

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

当然,您可以在条件中使用动态 where,但在同一个查询中执行。类似的东西,例如:

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());

【讨论】:

  • 我之前实际上已经尝试过,并且结果相同......问题是查询完全忽略了“日期” - 所以我搜索“Lorem”它会找到2个帖子带有文本 Lorem,但如果我指定日期为 2015 年,它应该找到 0 个帖子,因为 2015 年没有带有文本“lorem”的帖子
  • 我更新了我的原始问题以包含 SQL... 即: select * from posts where posts.title LIKE ?或posts.meta_description 喜欢?或posts.meta_keywords 喜欢?或posts.body 喜欢?或posts.seo_title 喜欢?和年份(created_at) = ?
  • 您是否查看过手动运行此查询时$date[0] 内部的哪些内容。这个 sql 看起来不错
【解决方案2】:

你可以使用 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());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-31
    • 2015-09-30
    • 2013-07-22
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    相关资源
    最近更新 更多