Laravel Eloquent创作于何处

时间:2017-01-05 11:25:12

标签: php mysql laravel laravel-5 eloquent

我试图在我的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:无法使用方法   写入上下文中的返回值

我想更多地了解滔滔不绝的功能元素,是否有任何文章可以指导我朝着正确的方向发展?

2 个答案:

答案 0 :(得分:1)

您的查询需要像这样修改

if (Input::get('month')) {
    $articles = NewsItem::where('created_at', Carbon::parse(Input::get('month'))->format('F Y'))->get();
};

请参阅Laravel WhereEloquent 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());
}