【发布时间】: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 * fromposts` 其中posts.titleLIKE ?或posts.meta_description喜欢?或posts.meta_keywords喜欢?或posts.body喜欢?或posts.seo_title喜欢?和年份(created_at)=? ` -
问题是查询完全忽略了“日期”——所以我搜索“Lorem”,它会找到 2 个带有 Lorem 文本的帖子,但如果我指定日期为 2015 年,它应该找到 0 个帖子,因为 2015 年没有包含文本“lorem”的帖子
标签: php mysql laravel eloquent