我试图在我的NewsItem表中查询在给定月/年中写的文章。
我将网址传递给GET变量
'/news?filter=true&month=January 2017'
在我的控制器中,我抓住变量并尝试在我的模态上运行查询
if(Input::get('month')){
$articles = NewsItem::where(DB::raw('created_at'),function($d){
Carbon::parse($d->created_at)->format('F Y') = Input::get('month');
})->get();
};
但是我收到以下错误
NewsController.php第28行中的FatalErrorException:无法使用方法 写入上下文中的返回值
我想更多地了解滔滔不绝的功能元素,是否有任何文章可以指导我朝着正确的方向发展?
答案 0 :(得分:1)
您的查询需要像这样修改
if (Input::get('month')) {
$articles = NewsItem::where('created_at', Carbon::parse(Input::get('month'))->format('F Y'))->get();
};
请参阅Laravel Where和Eloquent 101更多信息
答案 1 :(得分:0)
假设created_at是一个普通的datetime
字段。
如果你需要那个月的所有文章,你可以在两者之间使用一些好的Carbon助手,所以在这种情况下不需要使用闭包。
示例:
// Garble or empty inputs will throw an Exception in Carbon
try {
// this will create a Carbon object or Carbon will throw an exception
$date = Carbon::parse(request()->input('month'));
$articles = NewsItem::whereBetween('created_at', [
$date->startOfMonth()->toDateTimeString(),
$date->endOfMonth()->toDateTimeString(),
])->get();
} catch(\Exception $e) {
// gracefully handle Exception
dd($e->getMessage());
}
因此这里不需要使用闭包。
如果您想查看有关如何使用它们的示例,请参阅Laravel query parameter grouping
关于闭包的一些其他例子:
在你的情况下,你也可以在一个闭包中将2分组,而不是在两者之间使用:
// Garble or empty inputs will throw an Exception in Carbon
try {
// this will create a Carbon object or Carbon will throw an exception
$date = Carbon::parse(request()->input('month'));
$articles = NewsItem::where('created_at', function($query) use($date) {
$query
->where('created_at', '>=', $date->startOfMonth()->toDateTimeString())
->where('created_at', '<=', $date->endOfMonth()->toDateTimeString());
})->get();
} catch(\Exception $e) {
// gracefully handle Exception
dd($e->getMessage());
}