如何在 Laravel 5.4 中为一对多关系使用条件

How to use condition for one to many relationship in Laravel 5.4

我遵循这个 并且它工作得很好,但是当我尝试放置一个变量时它给我语法错误。

这是我的代码:

$ot_start = $request->ot_start;
$ot_end = $request->ot_end;
$ot_list = OTMain::with(['otmain_many_otline'=>function($query){
        $query ->where('time_from', '>=', date('d/M/Y H:i:s', strtotime($ot_start . ' 00:00:00.000')))
            ->where('time_from', '<=', date('d/M/Y H:i:s', strtotime($ot_end .' 23:59:59.000')));
        }])->get();

打印屏幕:

我不知道为什么 $ot_start$ot_end 会出错。

添加使用():

 $ot_list = OTMain::with(['otmain_many_otline'=>function($query) use (ot_start , ot_end ){
                         $query ->where('time_from', '>=', date('d/M/Y H:i:s', strtotime($ot_start . ' 00:00:00.000')))
                                 ->where('time_from', '<=', date('d/M/Y H:i:s', strtotime($ot_end .' 23:59:59.000')));
                         }])->get();

如果您使用闭包(匿名函数),您需要通过 use 传递变量。例如:

$ot_start = $request->ot_start;
$ot_end = $request->lot_end;
$ot_list = OTMain::with(['otmain_many_otline'=>function($query) use($ot_start,$ot_end){
    $query ->where('time_from', '>=', date('d/M/Y H:i:s', strtotime($ot_start . ' 00:00:00.000')))
        ->where('time_from', '<=', date('d/M/Y H:i:s', strtotime($ot_end .' 23:59:59.000')));
    }])->get();

匿名函数function($query) $ot_start$ot_end一无所知。这就是 phpstorm 标记这些变量的原因,因为它们在函数范围内未定义。

您需要使用 use 字明确地传递它们:

OTMain::with(['otmain_many_otline'=>function($query) use ($ot_start, $ot_end) {

现在,这些变量在函数中可用。