也许我这样做不正确,但我想要做的逻辑是:
我想首先选择包含特定字符串的所有帖子。
然后根据这些结果,我想将其缩小到仅限某个日期内的帖子(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,因为它不存在。
所以这里存在一些逻辑问题。有什么想法吗?
答案 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());